我想知道是否有任何方法可以限制使用自定义条件为模板生成代码在我的情况下我想要仅在模板类T已经通过类别栏继承时调用foo(类似这样)
template <class T:public bar> void foo()
{
// do something
}
答案 0 :(得分:9)
虽然使用“替换失败不是错误”(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 ++ 0x中添加的C ++标准库的新组件。如果你的编译器/标准库实现还不支持它们,你也可以在C ++ TR1或Boost.TypeTraits中找到它们。
答案 1 :(得分:0)
是的,可以使用以下技术(用于公共继承)。它只会导致一个指针初始化的开销。
修改:重写
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;
// ...
}