我是 SFINAE 的新手,我正在尝试编写一个简单的 Vector 模板。我想要实现的是根据为 Vector 设置的维度启用 z 成员变量。
我尝试使用以下代码实现此效果:
template<unsigned int DIMENSIONS>
class Vector {
// The x and y variables (same as z)
template<typename = typename std::enable_if<DIMENSIONS >= 3>::type>
/// <summary>
/// The z coordinate.
/// </summary>
Float& z;
Vector() : x(values[0]), y(values[1]) {
}
// Other member functions and variables
std::vector<float> values;
};
template <>
Vector<3>::Vector() : x(values[0]), y(values[1]), z(values[2]) {
}
当有 3 个或更多维度时,这应该启用 z 变量。这使得编译器报错如下:
'Vector<DIMENSIONS>::z': only static data member templates are allowed
此外,我不完全确定在这种情况下如何使用 SFINAE 的初始化列表。因为如果维度小于 3,则不必初始化 z(因为它不存在)。到目前为止,我已经为 3D vector 使用了专门的构造函数(请参阅上面的代码)。
但是 intelliisense 仍然报告说 成员 'x', 'y', 'z' 没有在这个构造函数中初始化。
如有任何帮助,我们将不胜感激。
最佳答案
你可以这样做:
struct no_z_var {};
struct z_var
{
float z;
};
template<std::size_t n>
struct my_vector : std::conditional_t<( n >= 3 ), z_var, no_z_var>
{
float x, y;
};
int main()
{
my_vector<3> mv3;
mv3.z = 3.4f;
my_vector<2> mv2;
mv2.z = 3.4f; // error; no 'z'
}
但是,这是一个好的解决方案/设计吗?我不确定;它会变得困惑。它很可能会在实现过程中出现其他困难......
关于c++ - 在非静态数据成员上使用 SFINAE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38247745/