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