我想问一下如何在课堂模板中大量使用长参数列表的指南。不确定的是,在模板化类中定义(模板化)方法,consts等时,需要重复参数列表两次。
问题类似于this one,但没有提供示例代码,我仍然无法编译我的大部分尝试。当我将参数移动到其他地方时,通常什么都得不到,因为我只需要在另一个地方(构造函数,结构等)定义我的长参数列表。
我会尝试给MWE。我希望实现以下目标:
#include <iostream>
template <class MyInt_t, int _N, int _M, MyInt_t _A, MyInt_t _B> class MyClass{
// generally this list is even longer and composed of fundamental classes
// and MyInt_t template type-parameter
public:
static const int N = _N, M = _M; // any way not to keep different names
// for params and fields? N = MyPars.N?
// static const MyInt_t MA[2] = {_A, _B}; // ...but ofc it will not work
// also cannot (or do not know how to) pass arrays to templates
static const MyInt_t MA[2]; // another repetition of template parameters below
MyInt_t getSth();
// rest of implementation with non-static fields and methods
};
// static const array definition
template <class MyInt_t, int _N, int _M, MyInt_t _A, MyInt_t _B>
const MyInt_t MyClass<MyInt_t, _N, _M, _A, _B>::MA[2] = {_A,_B};
// and now to defining the method...
template <class MyInt_t, int _N, int _M, MyInt_t _A, MyInt_t _B>
MyInt_t MyClass<MyInt_t, _N, _M, _A, _B>::getSth(){
std::cout << "Yey! " << N << ", " << M << " || " << MA[1] << std::endl;
return MA[0];
}
typedef MyClass<long long unsigned, 5,6, ~123ull, -5ull> MySpecClass1;
typedef MyClass<long unsigned, 13,19, 123ull, 456ull> MySpecClass2;
// main()
int main()
{
MySpecClass1 Obj1;
long long unsigned test = Obj1.getSth();
std::cout << "Bye! " << test << " || " << MySpecClass2::N << std::endl;
return 0;
}
输出
Yey! 5, 6 || 18446744073709551611
Bye! 18446744073709551492 || 13
注1:我太害羞了,不能使用预处理程序定义,但是当参数列表中有超过10个常量参数时,我出了名的不得不重复,那么它就变成了IMHO不可读。模板的目的是多次使用代码的干净方式......所以我一定做错了......还有一个参数有两个不同名称的问题:字段名称和模板非类型常数必须不同。
注2:我希望这些是静态常量,因为它们将表征整个专用类而不是它的实例。由于编译器优化,我也喜欢const。
摘要:我觉得上面的代码不是很优雅,并且当常量列表延长时,它有增长的倾向。有许多数学算法(如随机数生成器,求解器)需要很长的静态常量列表。