私のケースでカスタム条件を使用してテンプレートのコードを生成することを制限する方法があるのでしょうか?テンプレートクラスTがクラスバーによってインヘリットされている場合のみfooを呼び出すようにしたい使用しているが)テンプレートクラス制限
template <class T:public bar> void foo()
{
// do something
}
私のケースでカスタム条件を使用してテンプレートのコードを生成することを制限する方法があるのでしょうか?テンプレートクラスTがクラスバーによってインヘリットされている場合のみfooを呼び出すようにしたい使用しているが)テンプレートクラス制限
template <class T:public bar> void foo()
{
// do something
}
あなたは)(「置換の失敗はエラーではありません」SFINAEをT
を制限することができます。
template <typename T>
typename std::enable_if<std::is_base_of<bar, T>::value>::type foo()
{
}
T
場合はbar
に由来しない、関数テンプレートの特殊化を失敗します。過負荷解決時には考慮されません。 std::enable_if
とstd::is_base_of
は、C++標準ライブラリの新しいコンポーネントで、今後のリビジョンC++ 0xに追加されています。コンパイラ/標準ライブラリの実装がまだそれらをサポートしていない場合は、C++ TR1またはBoost.TypeTraitsでそれらを見つけることもできます。
実際、 'std'ライブラリに' is_base_of'がない場合、それはBoostにあります。 –
はい。 Boostに相当するのは、 'boost :: enable_if
あなたはstdライブラリ自体がどのようにクラスのenable_ifまたはis_base_ofに実装されているか考えていますか? – Ali1S232
はい、次の手法を使用できます(パブリック継承の場合)。 1つのポインタの初期化によるオーバーヘッドが発生します。
編集:再書き込み
template<typename Parent, typename Child>
struct IsParentChild
{
static Parent* Check (Child *p) { return p; }
Parent* (*t_)(Child*);
IsParentChild() : t_(&Check) {} // function instantiation only
};
template<typename T>
void foo()
{
IsParentChild<Bar, T> check;
// ...
}
あなたはブースト 'enable_if'を使用することができるかもしれません。 –
公開継承を扱っている場合は、さらにもう1つの方法があります。私の答えを見てください。 – iammilind