我试图找到是否有办法检查一个类是否具有功能,因为我想编写一个使用它的模板?
有一种简单的方法吗?或者我只是在try / catch中包装东西?或者编译器甚至不允许我这样做?
答案 0 :(得分:4)
如果你有一个类似的函数模板:
template <typename T>
void f(T x)
{
x();
}
你将无法使用任何不可调用的类型来实例化它作为不带参数的函数(例如,重载operator()
的类类型不带参数可被调用为不带参数的函数)。如果您尝试这样做,则会出现编译错误。
这是要求实例化模板具有某些属性的最简单方法:在编写模板时只依赖具有这些属性的类型,并且类型不具有所需属性之一,用这种类型实例化模板是不可能的。
答案 1 :(得分:2)
参数类型可以有多种方式适用于调用语法
当前的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} }