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)
另外,我宁愿不让这个类派生自另一个,或者完全专门化这个类.
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)
| 归档时间: |
|
| 查看次数: |
121 次 |
| 最近记录: |