c++ - 在非静态数据成员上使用 SFINAE?

标签 c++ template-specialization sfinae

我是 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/

相关文章:

c++ - STL 算法是否使用多核?

c++ - ifstream::read 不追加 '\0'

C++11 检查成员的 COM 智能指针

c++ - msvc2013 的 decltype 模板出错

c++ - 优化 C++ 代码以提高性能

c++ - 是否有适用于 Windows 的优秀 C++ XML DOM 教程?

c++ - 依赖非类型模板参数和可变参数模板

c++ - 如何使用 enable_if<>::type 返回类型制作函数原型(prototype)?

c++ - 调用模板函数而不是基类型的函数

C++ 模板特化