我正在尝试使用模板编程在 C++ 中实现 swizzle 向量。对于 swizzle 向量,我的意思是类似于 hlsl 和 glsl 向量的向量,例如,如果你有一个向量v = (1,2,3,4)
并且v.xxyz
它会产生向量 (1,1,2,3)。
这涉及一个类似于下面给出的示例的数据结构,但是我删除了一堆东西以生成一个最小的工作示例。
#include <iostream>
template <typename T>
class vec2
{
public:
template<unsigned a, unsigned b>
class swizzle
{
public:
T v[2];
public:
operator vec2() { return { v[a], v[b] }; }
};
public:
union
{
struct
{
T x, y;
};
swizzle<0, 0> xx;
swizzle<0, 1> xy;
swizzle<1, 0> yx;
swizzle<1, 1> yy;
T v[2];
};
};
template<typename T>
void Foo(const vec2<T>& bar)
{
std::cout << bar.x << ", " << bar.y << "\n";
}
void Bar(const vec2<float> bar)
{
std::cout << bar.x << ", " << bar.y << "\n";
}
int main()
{
vec2<float> v = { 1,2 };
Foo(v.xx); //Does not compile. Template argument deduction fails.
Foo((vec2<float>)v.xx); //Compiles. Prints "1, 1"
Foo(v); //Compiles . Prints "1, 2"
Bar(v.xx); //Compiles without having to explicitly cast it. Prints "1, 1"
std::cin.get();
return 0;
}
在上面的示例中,使用类型参数对 Foo 的调用swizzle
不会编译,除非我将其显式转换swizzle
为 avec2<float>
即使swizzle
具有转换运算符。处理模板时隐式转换不起作用吗?我的问题是我希望能够Foo
同时Foo(v)
使用Foo(v.xy)
.