我试图通过将行和列定义为模板参数来实现Matrix类。此外,我认为Vector是一个'降级'矩阵类,它共享大部分代码。
我想使用初始化列表初始化我的类,因为它在旧的c数组方式中使用。
当尝试根据Matrix或Vector向类中提供一个且只有一个构造函数时,问题就出现了,因此它禁止编译时间以将matritial初始化列表分配给向量并将向量初始化列表分配给矩阵。我已尝试使用模板和std :: enable_if,但我无法完全理解编译器的奇怪错误消息。
我发布减少的代码说明问题,清除所有试验来解决它。在评论中,我进一步解释了我想要做的事情。任何人都可以知道如何做我需要的东西?
#include <initializer_list>
template<int R, int C, typename T=int>
struct Matrix
{
T data[R][C];
Matrix(std::initializer_list<T> initializers) { }//Do some stuff inside
Matrix(std::initializer_list<std::initializer_list<T>> initializers) { }//Do some stuff inside
};
template<int R, typename T=int>
using Vector = Matrix<R, 1, T>;
int main()
{
Matrix<3, 3> m = { {1, 2, 3},
{4, 5, 6},
{7, 8, 9} };
Vector<3> v = {10, 20, 30};
Matrix<3, 3> m1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };//This must be avoided using templates in constructors or SFINAE
Vector<3> v1 = { {10, 20, 30} };//This must be avoided using templates in constructors or SFINAE
return 0;
}
另外,我发布了一个coliru链接,使用相同的代码:http://coliru.stacked-crooked.com/a/17b5e8c504c262d1
非常感谢你提前。
使用C ++ 20,您可以使用requires
来丢弃重载:
template <int R, int C, typename T=int>
struct Matrix
{
T data[R][C];
Matrix(std::initializer_list<T> initializers) requires (C == 1)
{ /*..*/ }
Matrix(std::initializer_list<std::initializer_list<T>> initializers) requires (C != 1)
{ /*..*/ }
};
在此之前,专业化:
template <int R, int C, typename T=int>
struct Matrix
{
T data[R][C];
Matrix(std::initializer_list<std::initializer_list<T>> initializers)
{ /*..*/ }
};
template <int R, typename T>
struct Matrix<R, 1, T>
{
T data[R][1];
Matrix(std::initializer_list<T> initializers)
{ /*..*/ }
};
或SFINAE可以使用:
template <int R, int C, typename T=int>
struct Matrix
{
T data[R][C];
template <typename D = C, std::enable_if_t<D == 1, int> = 0>
Matrix(std::initializer_list<T> initializers)
{ /*..*/ }
template <typename D = C, std::enable_if_t<D != 1, int> = 0>
Matrix(std::initializer_list<std::initializer_list<T>> initializers)
{ /*..*/ }
};