因此,我试图简化通用类的使用,并遇到了以下想法:
给出以下结构:
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
};
显然,如果我尝试像这样运行程序,数组将抛出超出范围的异常。
现在有没有办法仅在给出条件(在编译时已知)的情况下声明这些别名?
我想到了 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];
};
另外,我愿意宁愿不让一个类派生自另一个类,或者完全特化该类。
据我所知,您可以做到这一点,并仅通过继承或专门化来保留语法。
如果你想避免这种情况,你需要稍微改变一下界面。你需要做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]; };
};
Vector<2> v;
v.x();
v.y();
v.z(); // error: no matching member function for call to 'z'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)