如何检查模板参数是否为给定值?

时间:2018-07-06 07:48:41

标签: c++

我不知道这行应该是什么:

class Mtx : public std::conditional<M==2 && N == 1, _Vec2<T>, 
std::conditional<N == 1 && M == 3, _Vec3<T>, _MtxMN<T, M, N>>>

我认为“ M == 2 && N == 1”在这里无效。

我想做的是可能的吗?如果M = 2且N = 1,我想从_Vec2继承,如果M = 3且N = 1,我要从_Vec3继承,否则从_MtxMN继承

这样我就可以编写代码:

Vec2u v;
v.x=1;

下面的较大代码段:

template <typename T, std::size_t M, std::size_t N>
struct _MtxMN {
public:
    std::array<T, M*N> v_;
};

template <typename T> 
struct _Vec2 {
    union {
        struct { T x_, y_; };
        struct { T width_, height_; };
        struct { T cols_, rows_; };
        std::array<T, 2> v_;
    };
};

template <typename T>
struct _Vec3 {
    union {
        struct { T x_, y_, z_; };
        struct { T width_, height_, depth_; };
        std::array<T, 3> v_;
    };
};

// M rows N columns
template <typename T, std::size_t M, std::size_t N>
class Mtx : public std::conditional<constexpr(M==2 && N == 1), _Vec2<T>, std::conditional<N == 1 && M == 3, _Vec3<T>, _MtxMN<T, M, N>>>
{
...
}

2 个答案:

答案 0 :(得分:1)

在我看来,易于理解的实现可以与部分模板专门化一起使用:

template <typename T, std::size_t M, std::size_t N>
class Mtx : public _MtxMN<T, M, N>
{};

template <typename T>
class Mtx<T, 2, 1> : public _Vec2<T>
{};

template <typename T>
class Mtx<T, 3, 1> : public _Vec3<T>
{};

当编译器寻找模板实例的匹配项时,它将强制执行所需的继承结构。

Mtx<int, 3, 6> mtx1; // instantiation that inherits from _MtxMN
Mtx<int, 2, 1> mtx2; // instantiation that inherits from _Vec2
Mtx<int, 3, 1> mtx3; // instantiation that inherits from _Vec3

答案 1 :(得分:1)

您的Mtx声明中存在一些语法错误。应该是

class Mtx : public std::conditional<M==2 && N == 1, _Vec2<T>, typename std::conditional<N == 1 && M == 3, _Vec3<T>, _MtxMN<T, M, N>>::type>::type

std::conditional的基础类型需要用::type进行引用,对于第二个std::conditional,我们需要在其前面添加一个typename,因为它是从属名称。
还删除了constexpr()部分,该部分不是必需的,并且不能在gcc或clang上编译。