任何方法来确定类是否实现operator()

时间:2010-06-20 01:13:25

标签: c++ templates operator-overloading

我试图找到是否有办法检查一个类是否具有功能,因为我想编写一个使用它的模板?

有一种简单的方法吗?或者我只是在try / catch中包装东西?或者编译器甚至不允许我这样做?

4 个答案:

答案 0 :(得分:4)

如果你有一个类似的函数模板:

template <typename T>
void f(T x)
{  
    x();  
}  

你将无法使用任何不可调用的类型来实例化它作为不带参数的函数(例如,重载operator()的类类型不带参数可被调用为不带参数的函数)。如果您尝试这样做,则会出现编译错误。

这是要求实例化模板具有某些属性的最简单方法:在编写模板时只依赖具有这些属性的类型,并且类型不具有所需属性之一,用这种类型实例化模板是不可能的。

答案 1 :(得分:2)

参数类型可以有多种方式适用于调用语法

  1. 类型为指针引用功能类型,或
  2. 类型为类型转换函数 1。中的某个类型具有转换函数,或具有适用的运算符()即可。
  3. 当前的C ++无法检查 2。,因此您无需检查,就像其他答案解释一样。

答案 2 :(得分:0)

这样做会导致编译错误。编译代码时,模板函数或模板类将针对所使用的类型进行扩展,就像该模板代码的副本一样,每种类型一个。

所以你基本上可以做任何事情,只要你的模板使用的所有类型都支持它,你就没有问题。如果他们不支持它,则会出现编译错误,如果不修复它就无法运行代码。

template <typename T>
void DoIt(T a)
{
    a.helloworld();//This will compile fine
    return a();//This will cause a compiling error if T is B
}

class A
{
public:
    void a.helloworld(){}
    void operator()(){}
};

class B
{
public:
    void a.helloworld(){}
};

int main(int argc, char**argv)
{
    A a;
    B b;
    DoIt(a);
    DoIt(b);//Compiling error

    return 0;
}

答案 3 :(得分:0)

如果您确实需要测试以查看类型T是否实现某个给定签名的operator(),那么您可以使用相同的SFINAE技巧来识别此处讨论的任何其他类成员的存在:{{3} }