根据模板参数条件C++ 17创建成员别名

Sir*_*hot 2 c++ variables alias templates metaprogramming

所以,我正在尝试简化我的泛型类的使用,并遇到了以下想法:

给出以下结构:

template <size_t size>
struct Vector {
    std::array<float, size> data;

    float& x = data[0];
    float& y = data[1]; // Declare y only if size is > 0
    float& z = data[2]; // Declare z only if size is > 1
    float& w = data[3]; // Declare w only if size is > 2
};
Run Code Online (Sandbox Code Playgroud)

显然,如果我尝试像这样运行程序,数组将抛出超出范围的异常.

现在有没有办法只在条件(编译时已知)给出时声明这些别名?

我想到了std :: enable_if的方式:

template <size_t size>
struct Vector {
    std::array<float, size> data;

    float& x = data[0];
    declare_if<(size > 0), float&> y = data[1];
    declare_if<(size > 1), float&> z = data[2];
    declare_if<(size > 2), float&> w = data[3];
};
Run Code Online (Sandbox Code Playgroud)

另外,我宁愿不让这个类派生自另一个,或者完全专门化这个类.

bol*_*lov 5

AFAIK你可以这样做,只保留你的语法继承或专业化.

如果你想避免它,你需要改变一点界面.你需要让x,y,z,t方法.实际上方法模板:

template <size_t size>
struct Vector {
    std::array<int, size> data;

    template <std::size_t S = size, class = std::enable_if_t<(S > 0)>>
    auto x() -> int& { return data[0]; };

    template <std::size_t S = size, class = std::enable_if_t<(S > 1)>>
    auto y() -> int& { return data[1]; };

    template <std::size_t S = size, class = std::enable_if_t<(S > 2)>>
    auto z() -> int& { return data[2]; };

    template <std::size_t S = size, class = std::enable_if_t<(S > 3)>>
    auto t() -> int& { return data[3]; };  
};
Run Code Online (Sandbox Code Playgroud)
Vector<2> v;

v.x();
v.y();
v.z(); // error: no matching member function for call to 'z'
Run Code Online (Sandbox Code Playgroud)