gpt4 book ai didi

c++ - 将元组转换为模板中的结构

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:52:28 25 4
gpt4 key购买 nike

我正在学习 OpenGL 作为练习,并希望推出我自己的数学库,以便使用 C++11 模板进行舒适的编程。此问题的解决方案不应调用运行时多态性。

基本的想法是我想要这样的东西(注意这显然不是有效的 C++ 代码):

template<class T, int n> //element type is T, size is n
class Vector {
T v1, v2, ... , vn;
public:
Vector(T v1, ... , T vn);
~Vector() noexcept;
...
// more constructors and stuff here.
}

template<T, n>
Vector<T, n> operator +(Vector<T, n> lhs, Vector<T, n> rhs);

...
// more math functions and operators here...

问题是,当它们作为数组传递给 OpenGL 函数时,我想将这些 vector 透明地转换为常规 C 结构。例如,对于 n == 3 , 我想转换我的 Vector<T, 3>变成这样的东西:

template<class T>
struct Vec3 {
T v1, v2, v3;
}

这样我就可以打电话了:

Vector<float, 3> vertices[1];
vertices[0] = Vector<float, 3>(1.0f, 1.0f, 1.0f);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

让它正常工作,就好像我使用了 Vec3<float> 的数组一样的。我想要 n == 2 的这种行为, n == 3 , 和 n == 4 .我不想编写 3 个类并为每个类实现数学运算符。

我的第一次尝试是将 SFINAE 与转换运算符一起使用:operator T() .

// Inside Vector's declaration...
public:
operator typename std::enable_if<n == 3, Vec3<T>>::type();

这可能只对 n == 3 有效,但我还需要:

    operator typename std::enable_if<n == 2, Vec2<T>>::type();
operator typename std::enable_if<n == 4, Vec4<T>>::type();

g++ 提示 enable_if没有 ::type当我实例化 Vector<float, 3> 时,typedef 为 2 和 4 .

此时我使用的是 std::array<T, n>坚持我的值(value)观,但我意识到这并没有真正奏效。这是否意味着我的值实际上不在类中,而是保存在其他地方,因此传递类的数组就像传递 std::array<T, n> 的数组一样,不是 Vec3<T> 的数组?

我目前感兴趣的领域是使用 std::tuple<class... Types> ,因为它们直接将值存储在类中。这个想法有几个问题:

  1. 我想将元组的类型限制为只有一种类型,以便我的 Vector 是同构的。
  2. 我希望能够获取元组的大小而不将其存储在我的类中。
  3. 我仍然需要实现 operator Vec3<T>()和 friend 。
  4. 我不知道 sizeof(tuple<float, float, float>) == sizeof(Vec3<float>) ,或任何关于内存布局的保证,允许我安全地(比如)转换 tuple<float, float, float>进入Vec3<float> .例如,我听说 g++ 的 stdlib 在类中以相反的顺序存储元组值。

最佳答案

std::array<T, n>保证是 T[n] 的零开销包装器,因此您可以简单地将其存储在您的类中,并确保没有可能会扰乱 OpenGL 调用的填充。

关于c++ - 将元组转换为模板中的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31479400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com