2016-06-22 64 views
1

我想專門化一個模板函數來獲取非指針類型,並且如果它獲得一個指針,我想在沒有*的情況下調用它。模板函數沒有對象參數專門化

我想知道如果沒有使用std :: remove_pointer的方法。

比如我想要做這樣的事情:

template<typename T> 
void setName() { 
    name = __PRETTY_FUNCTION__; 
} 

template<typename T> 
void setName<T*>() { 
    setName<T>(); 
} 

name被定義爲一個私有數據成員。

+0

你試過了嗎? –

+0

@CrazyEddie是的,我得到的''模板 void Type :: setName()'不能重載「 – Loay

回答

3

你的想法是正確的,但在C++中不允許使用部分函數模板專門化。 Fortuately部分類模板特殊化允許這樣你就可以使用靜態方法解決方法(請參見下面的setName_impl專業化),如果需要的函數模板包裝(見下文setName()):

template<typename T> 
struct setName_impl{ 
    static void exec() { } 
}; 

template<typename T> 
struct setName_impl<T*>{ 
    static void exec() { 
     setName<T>::exec(); 
    } 
}; 

template<typename T> 
void setName() { 
    setName_impl<T>::exec(); 
} 
+0

但我希望setName是一個函數而不是結構 – Loay

+0

@Loay它是包含靜態方法的結構。查看我剛剛添加的答案的結尾。 –

+0

只需創建一個調用此結構的靜態方法的函數,這可能是最簡單的方法。 'template void setName(){name = setNameImpl :: exec(); }' – SirGuy