3

クラスTが特別な基本クラスT_baseの派生クラスのみに制限される関数テンプレートを作成したいと思います。これを達成するための効率的な方法は何ですか?ご協力いただきありがとうございます!

4

3 に答える 3

7

タイプ特性とSFINAEを使用できます

template<typename T, 
         bool[std::is_base_of<T_base, T>::value] = nullptr>
void f(T const&);

C++11でも機能するC++03バージョン

template<typename T>
typename boost::enable_if< boost::is_base_of<T_base, T> >::type 
f(T const&);

enable_ifデフォルトの引数を使用して、テンプレートパラメータリストに移動するC++11バージョンがあります

template<typename T, 
         typename = typename std::enable_if<
           std::is_base_of<T_base, T>::value>::type>
void f(T const&);

残念ながらf、他のオーバーロードの唯一の違いがSFINAE文字列(つまり、デフォルトの引数)である場合、デフォルトの引数は関数テンプレートのシグネチャの一部ではないため、オーバーロードできません。ただし、テンプレートパラメータ自体のタイプは同じです(これらのルールは通常の関数パラメータの場合とまったく同じです)。

于 2011-12-04T19:14:10.113 に答える
1

C++0xにはstd::enable_if;があります。コンパイラがまだサポートしていない場合は、がありboost::enable_ifます。

たとえば、署名がの場合、次のようtemplate<typename T> int f(T&)になります。

template<typename T>
  std::enable_if<std::is_base_of<T_base, T>::value, int>::type f(T&);
于 2011-12-04T19:25:59.527 に答える
0

私が考えることができる最も簡単な方法は、次のようなものです。

template<class T>
void someFunc(T arg)
{
    dynamic_cast<BaseClass>(arg); // will throw an exception if not castable to base class
    // continue...
}
于 2011-12-04T19:16:16.177 に答える