簡體   English   中英

具有模板的功能模板專業化

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

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