我不知道这行应该是什么:
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>>>
{
...
}
答案 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上编译。