[英]Function template specialization with template
我有一個專門針對各種類型的功能模板。 但是,我想為指針定義模板特化。
為了澄清起見,這是現有代碼的一部分:
template<typename T> inline T Get(int i);
/* ... */
template<> inline bool Get(int index) {
//...
}
template<> inline std::string Get(int index) {
//...
}
現在,我計划添加在T
是指向類的指針時執行的特化。 我嘗試添加以下幾行,但是這種(可能是不完整的)變體似乎沒有被接受為第一個未定義模板的特殊化。 ( Call is ambiguous
); 其他類型特征的安排也沒有以成功的編譯而告終。
template<typename T>
typename std::enable_if<std::is_pointer<T>::value, T>::type
inline Get(int index) {
//...
}
我在這里有什么選擇?
您不能對功能模板進行部分專業化,而您的嘗試實際上創建了一個不同的重載模板。 沒有所有SFINAE雜音的最干凈的方法是將其包裝在可以部分專門化的類模板中,然后編寫一個分派到適當的類模板專門化的功能模板:
template <class T>
struct do_get;
template <>
struct do_get<bool> {
static bool get(int i) { /*...*/ }
};
template <class T>
struct do_get<T*> {
static T* get(int i) { /*...*/ }
};
template <class T>
T Get(int i) { return do_get<T>::get(i); }
另一種方法是,當T
為指針時,使用enable_if
顯式禁用未定義的基礎模板,但是如果您要添加其他重載,這很快就會變得不堪重負。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.