【发布时间】:2019-10-07 18:31:48
【问题描述】:
我正在尝试实现一个简单的向量混合功能作为一个宠物项目,以进入模板元编程。在开源数学库 glm 和其他一些关于 SO 的帖子的帮助下,我想出了一个基本上可以工作但有一个错误的解决方案。
我已经实现了几个结构,这些结构包含我需要表示二维欧几里德向量的数据。结构“vec2”有一个联合,它包含一个带有两个元素(浮点数据 [2])的浮点数组和两个结构“scalarSwizzle”实例,它应该实现 swizzling 机制,它允许我像 vec 一样访问向量。 data[0] 左右 vec.x.
按照我目前实现的代码:
#include <iostream>
template<typename T>
void print(T value)
{
std::cout << "print func: " << value << std::endl;
}
template<typename T, unsigned int I>
struct scalarSwiz
{
T value[1];
T &operator=(const T newValue)
{
value[I] = newValue;
return value[I];
}
operator T()
{
return value[I];
}
};
template<typename T>
struct vec2
{
union
{
T data[2];
scalarSwiz<T, 0> x;
scalarSwiz<T, 1> y;
};
vec2()
{
x = 0.0f;
y = 1.0f;
}
vec2(T pA, T pB)
{
x = pA;
y = pB;
}
};
int main(int argc, char *args[])
{
vec2<float> vec1{5.0f, 1.0f};
std::cout << "value vec1.data[0]: " << vec1.data[0] << std::endl;
std::cout << "value vec1.data[1]: " << vec1.data[1] << std::endl;
std::cout << "value vec1.x: " << vec1.x << std::endl;
std::cout << "value vec1.y: " << vec1.y << std::endl << std::endl;
print(vec1.data[0]);
print(vec1.data[1]);
print(vec1.x);
print(vec1.y);
std::cin.get();
}
输出如下:
value vec1.data[0]: 5
value vec1.data[1]: 567.4
value vec1.x: 5
value vec1.y: 567.4
print func: 5
print func: 567.4
print func: 5
print func: 2.5565e-39
我希望直接在 main() 和通过 print() 中打印值的输出是相同的,但是当我通过 print() 函数打印它时 vec.y 没有解析。所以我猜想“scalarSwizzle”中的重载类型转换运算符有问题,但我不知道是什么。 我也不明白的是,为什么 Visual Studio 也无法正确解析值,如下图所示:
vec1.y 似乎指向与 vec.x 相同的物理地址,而 main() 中的直接 std::cout 工作正常。
我已经尝试了几天来解决这个问题,为什么重载的类型转换运算符不适用于 vec.y,但我就是不明白。也许这里有人可以帮助我解决这个问题。
谢谢!
【问题讨论】:
-
为什么
print是一个函数模板? typename 在函数的任何地方都没有使用。只要让它成为一个正常的功能,它应该可以工作。查看演示:wandbox.org/permlink/SqHzMJXR1wCVjgOR -
好的。我在那里使用了一个模板来为许多输入数据类型提供一个打印功能。你能解释一下为什么它可以在没有模板的情况下工作吗?你对我描述的视觉工作室问题有什么想法吗?
-
Timo 的回答帮助解决了我的问题。我将我的代码的更新版本作为答案放在下面。
标签: c++ struct union typecast-operator