[英]Passing template type parameter as a type of template non-type parameter
很好奇:在C ++ 17和更高版本中,我們可以對非類型模板參數使用auto
占位符:
template<typename A, auto B>
class C {
public:
A foo() { return B; }
};
但是我們可以傳遞而不是auto
傳遞模板類型參數A
嗎?
example.cpp
template<typename A, A B>
class C {
public:
A foo() { return B; }
};
int main()
{
C<int, 5> c;
std::cout << c.foo() << std::endl;
return 0;
}
在實踐中,我們可以做到這一點,並且-std = c ++ 11的clang允許這樣做。
$ g++ -std=c++11 example.cpp
$ ./a.out
5
但是標准呢? 我沒有為此找到任何明確的規則。 謝謝!
模板參數可以分為:
1. Type parameters
2. Non type parameters
3. Template template parameters
在您的情況下,語句AB
是非類型模板參數,其類型為模板類型參數A
請記住,在您的示例中,您執行以下操作:
return B;
上面的聲明將在不可copy constructible
類型A
上失敗(這很容易用一個概念表示)。
請記住(如注釋中所指出),C ++ 17強制執行復制省略。
但是,我們可以傳遞而不是定義在左側的“自動”模板類型參數嗎?
當然。 這是舊的方式。
但是auto
方式可以避免通過A
型。
在C ++ 17中,您可以編寫
template <auto B>
class C {
public:
auto foo() { return B; }
};
因此不需要傳遞A
型。
我不知道在C ++ 11 / C ++ 14中也可以做到這一點。
我的意思是:如果需要,在C ++ 11 / C ++ 14中將值傳遞給模板...如果類型是固定的,則沒有問題
template <int I>
但是類型本身可以不同,在C ++ 11 / C ++ 14中,您必須先傳遞類型,然后傳遞值,如您的example.cpp
template <typename T, T A>
從舊的角度來看,問題在於,如果您要調用該類型的模板,則必須冗余並編寫一些內容,例如
C<decltype(x), x> some_C_variable;
我知道避免這種冗余的唯一方法是通過make函數(例如make_tuple()
)或C樣式宏。
在C ++ 17中,您可以簡單地編寫
C<x> some_C_variable
並且,在C模板類/結構內部,可以從decltype(B)
獲得x
的類型。
對於C ++ 17標准參考...
首先,將auto
定義為“ placeolder”
從10.1.7.4( auto
說明符)開始,指向第1點
auto
和decltype(auto)
類型說明符用於指定占位符類型,該占位符類型將在以后通過初始化程序的推導來替換。
在C ++ 11 / C ++ 14中也是如此
但是C ++ 17標准在第4點枚舉中為“模板參數”(17.1)添加了新點4.6
- 非類型模板參數應具有以下(可選,具有cv限定)類型之一:
[...]
(4.6)包含占位符類型(10.1.7.4)的類型
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.