簡體   English   中英

C ++模板作為模板的參數

[英]C++ Templates as arguments for templates

我遇到了以下問題。 我有以下模板Number

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的正確方法是什么? 我認為這里可能需要模板模板參數,但我也無法使用它。 非常感謝幫助。

Number<int>不能用作非類型模板參數,因為用戶定義的類不是允許的類型之一。 允許的類型是(從cppreference.com轉載):

  • std :: nullptr_t(自C ++ 11起);
  • 積分型;
  • 左值引用類型(對象或函數);
  • 指針類型(對象或函數);
  • 指向成員類型的指針(到成員對象或成員函數);
  • 枚舉類型。

您可以按照評論中的nm建議進行操作

template<typename n1, typename n2>
struct Number_add
{
    static const int value = n1::value + n2::value;
}
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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM