给定以下两个函数模板:
template <typename T>
void gorp(T*, std::function<void(T*)>)
{
}
template <typename T>
void klop(T*, std::function<void()>)
{
}
函数klop()
如我所期望的那样工作,但gorp()
没有:
int x = 3;
//fails: candidate template ignored: could not match
//'function<void (type-parameter-0-0 *)>' against '(lambda at ...)
gorp( &x, [](int*){}); //1
//works
gorp<int>( &x, [](int*){}); //2
//fails: candidate template ignored: could not match
//'function<void (type-parameter-0-0 *)>' against 'void (^)(int *)'
gorp( &x, ^(int*){}); //3
//works
gorp<int>( &x, ^(int*){}); //4
//works
klop( &x, [](){}); //5
//works
klop( &x, ^(){}); //6
第3、4、6行使用clang blocks;第1、2、5行使用lambdas。
请注意,对klop()
的调用在推断T
时没有问题,但我必须帮助解决对gorp()
的调用。
我很困惑,gorp()
计算T
不是应该加倍容易吗?
2条答案
按热度按时间cx6n0qe31#
如果你必须有
std::function
,你可以禁止这个参数的类型推导:但是我会推荐
它接受了前一个版本接受的所有内容,甚至更多,并且更有效地完成了这些操作,而无需转换为
std::function
。u7up0aaq2#
它不会推断类型
T
,因为你没有传递std::function
。如果还需要转换,类型推断就不起作用。这确实起作用:使用普通函数指针也是如此:
或者支持Clang“块”:
最后,用一个定义来支持上述所有内容:
如果函数被多次调用,这可能比使用
std::function
的定义更有效,因为std::function
确实会带来一些开销。