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

C++ 如果模板类型是可实例化的,请执行某些操作,c++,templates,sfinae,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() {

如果可以实例化某个模板类,我想使用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" 
  }
}
//仅对T.x()正常的类型T进行实例化:
模板
类模板类
{
T;
公众:
void foo(){
t、 x();
}
}
模板
类用户
{
void foo()
{ 
“如果TemplateClass正常,则执行其他操作,不执行任何操作”
}
}
我怎么能这么做

非常感谢

编辑:根据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();
模板
结构模板类
{
T;
void foo(){t.x();}
静态常量布尔值=真;
};
结构A{};
结构B{void x(){};
模板
结构用户
{
模板
typename boost::enable_if::type func()
{ 

std::cout您应该查看boost头和相关的元/模板编程代码

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

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

template<typename M>
typename boost::enable_if<Template<M>>::type func( ) { }
模板
typename boost::enable_if::type func(){}
仅当模板是有效类型时,才会定义此函数。由于您始终希望编译,因此需要相应的模板,因此当模板无效时要调用的函数:

template<typename M>
typename boost::disable_if<Template<M>>::type func( ) { }
模板
typename boost::disable_if::type func(){}
我不确定您是否可以在一个模板中定义此模式中的两个成员函数,而不将它们都设置为模板函数。我想您可能可以定义这两个模板函数并将默认模板参数设置为T


我希望这能有所帮助。

它可以编译,因为模板实际上是有效的……我现在试图弄清楚它为什么有效——如果您尝试调用“foo”它失败了。我正在查看它…我看到我以前使用过boost内省库。如果有一个has_member_函数构造。这可能是您正在寻找的。代码很复杂,为什么上面的内容不起作用与模板的工作方式密切相关,我认为我没有资格解释它。尽管我知道我有这样的东西我接受了这个答案,因为我最终使用了enable_if_c和traits类,如果类型是可实例化的,则该类提供信息——不是让编译器找到它,而是“手动”定义它。