[英]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.