2017-03-05 173 views
3

我遇到了以下问题。我有以下模板Number作为模板参数的C++模板

template<int n> 
struct Number 
{ 
    static const int value = n; 
}; 

现在假设我想在编译时增加两个这样的数字。具体而言,我想下面的代码片段工作:

//The following code should display 7: 
std::cout << Number_add< Number<3>, Number<4> >::value << std::endl; 

我想是这样的,但我的编译器不喜欢它。

template<Number<int> n1, Number<int> n2> 
struct Number_add 
{ 
    static const int value = n1::value + n2::value; 
} 

什么是落实Number_add正确的方法是什么?我认为模板模板参数可能在这里需要,但我无法让它工作。帮助将不胜感激。

+3

'模板<类N1,N2类>结构Number_add' –

+0

嗯,它的作品,非常感谢! – arriopolis

回答

4

Number<int>不能用作non-type template parameter,因为用户定义的类不是允许的类型之一。允许的类型(从cppreference.com再现):

  • 的std :: nullptr_t(因为C++ 11);
  • 整型;
  • 左值引用类型(对象或函数);
  • 指针类型(对象或函数);
  • 指向成员类型(指向成员对象或成员函数)的指针;
  • 枚举类型。

你可以简单地做作为n.m的意见建议

template<typename n1, typename n2> 
struct Number_add 
{ 
    static const int value = n1::value + n2::value; 
} 
1
template<int A, int B> 
constexpr Number<A+B> 
operator+(Number<A>, Number<B>){ return {}; } 

template<class Lhs, class Rhs> 
using Number_add=decltype(Lhs{}+Rhs{}); 

std::cout << Number_add< Number<3>, Number<4> >::value << std::end; 

打印7.