如何方便地处理C ++类模板中的长参数列表?

时间:2015-06-14 11:07:49

标签: c++ templates

我想问一下如何在课堂模板中大量使用长参数列表的指南。不确定的是,在模板化类中定义(模板化)方法,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。

摘要:我觉得上面的代码不是很优雅,并且当常量列表延长时,它有增长的倾向。有许多数学算法(如随机数生成器,求解器)需要很长的静态常量列表。

0 个答案:

没有答案