2016-06-22 8 views
1

テンプレート関数を非ポインタ型にすることを特化したいのですが、ポインタを取得した場合には*を付けずに呼び出すことにしたいと思います。オブジェクト引数なしのテンプレート関数

std :: remove_pointerを使用しない方法があるのだろうかと思います。

例えば、私はこのような何かをしたいと思います:

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

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

nameは、プライベートデータメンバーとして定義されます。

+0

:Fortuatelyパーシャルクラステンプレートの特殊化は、静的メソッドの回避策を使用することができるように許可(以下setName_implの専門を参照)、あれば必要な関数テンプレートラッパ(以下setName()を参照)されましたか? –

+0

@CrazyEddieはい、私はテンプレートを取得しています void :: setName() 'はオーバーロードできません " – Loay

答えて

3

あなたの考えは正しいですが、部分的な関数テンプレートの特殊化はC++では許可されていません。あなたはそれを試してみました

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

この構造体の静的メソッドを呼び出す関数を作成するだけです。これはこれを実行する最も簡単な方法です。 'テンプレート void setName(){name = setNameImpl :: exec(); } ' – SirGuy

関連する問題