基于模板参数条件创建成员别名 C++17

2024-05-11

因此,我试图简化通用类的使用,并遇到了以下想法:

给出以下结构:

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(使用前将#替换为@)

基于模板参数条件创建成员别名 C++17 的相关文章

随机推荐