2012-11-29 23 views
31

は、私はテンプレート関数と二つのクラステンプレートパラメータのタイプを確認するにはどうすればよいですか?

Tのためのチェックは動物であるどのようにすればいい
class animal { 
} 
class person { 
} 

template<class T> 
void foo() { 
    if (T is animal) { 
    kill(); 
    } 
} 

があると?私は 実行時にチェックするものを持っていたくありません。これはTとして渡されたタイプに基づいて、全く新しい機能を作成すること

template <> void foo<animal> { 

} 

注:ありがとう

答えて

48

使用is_same

#include <type_traits> 

template <typename T> 
void foo() 
{ 
    if (std::is_same<T, animal>::value) { /* ... */ } // optimizable... 
} 

は通常、それはしかし、全く実現不可能なデザインだし、あなたが本当にしたいを特化:

template <typename T> void foo() { /* generic implementation */ } 

template <> void foo<animal>() { /* specific for T = animal */ } 

注意もそれがで関数テンプレートを持っている珍しいこと明示的(推論されない)の引数。それは聞いたことがありませんが、しばしばより良いアプローチがあります。

+0

TThanks!実際にそれらは多くのコードを共有しているので、実際には複製できません。 – WhatABeautifulWorld

+1

@WhatABeautifulWorld:タイプ依存部分が特殊化可能な関数に降格されるように、コードを因数分解することができます... –

+0

速いフォローアップstd :: is_sameを使用すると、他のテンプレートパラメータのコードが遅くなることはありません。 – WhatABeautifulWorld

5

は、次のようなそれらのパラメータに渡されているものに基づいてテンプレートを特化することができます。これは通常、クラッタを減らし、本質的にテンプレートを最初に持っている理由として好ましいものです。

+0

Hmm。この方法は本当にテンプレート引数を特殊化する唯一の好ましい方法ですか?たとえば、テンプレート関数内で管理する必要のある10種類の子クラスがあるとします。クラスごとに10種類のテンプレート関数を書く必要がありますか?私はここでコアポイントを逃しているかもしれないと思う。 –

3

私は今日は、それを使用する方が良いと思っていますが、C++でしかないと思います。

#include <type_traits> 

template <typename T> 
void foo() { 
    if constexpr (std::is_same_v<T, animal>) { 
     // use type specific operations... 
    } 
} 

あなたはconstexprなしif式の本体内のいくつかの種類の特定の操作を使用している場合、このコードはコンパイルされません。

+1

を使用すると、短くすることができます:' std :: is_same_v ' – Fureeish

+0

yep is_same_v、ありがとう –

関連する問題