如果模板类型是可实例化的,请执行某些操作

时间:2010-11-04 09:13:28

标签: c++ templates sfinae

如果我可以实例化某个模板类,我想使用SFINAE模式执行一些代码。让我们想象一下:

//Only instantiable with types T for which T.x() is ok:
template <class T>
class TemplateClass
{
  T t;
public:
  void foo() { 
    t.x(); 
  }
}

template <class T>
class User
{
  void foo()
  { 
    "if TemplateClass<T> is ok then do something else do nothing" 
  }
}

我怎么能这样做?

非常感谢!

编辑:根据edA-qa mort-ora-y的回答我试过:

template <class T>
struct TemplateClass
{
    T t;
    void foo() { t.x(); }

    static const bool value = true;

};
struct A {};
struct B { void x() {} };

template <class T>
struct User
{
    template<typename M>
    typename boost::enable_if<TemplateClass<M> >::type func( ) 
    { 
        std::cout << "enabled\n";
    }

    template<typename M>
    typename boost::disable_if<TemplateClass<M> >::type func( ) 
    { 
        std::cout << "disabled\n";
    }


    void foo()
    {
        func<TemplateClass<T> >();
    }

};

User<A> a;
a.foo();

User<B> b;
b.foo();

但是这会返回“启用启用”。我错过了什么?

1 个答案:

答案 0 :(得分:1)

您应该查看boost boost/utility/enable_if.hpp标头和相关的元/模板编程代码。

这里最简单的方法是拥有两个版本的foo函数,这两个版本都是模板函数。其中一个函数将使用enable_if结构,另一个函数将使用disable_if结构。

我相信你可以在boost网站找到更好的例子,但是这样的话:

template<typename M>
typename boost::enable_if<Template<M>>::type func( ) { }

仅当Template是有效类型时才会定义此函数。由于你总是想编译,你需要对应的函数,当函数无效时调用它:

template<typename M>
typename boost::disable_if<Template<M>>::type func( ) { }

我不确定您是否可以在单个模板中定义此模式中的两个成员函数,而不将它们作为模板函数。我想您可能能够定义两个模板函数并将默认模板参数设置为T.

我希望有所帮助。