2017-03-05 212 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.