【发布时间】:2013-08-07 15:22:36
【问题描述】:
通常,要测试一个指针是否指向函数,使用std::is_function 就足够了。
但是,它不能与 lambda 一起使用。由于 lambda 是一个带有operator() 的对象。
现在我必须同时使用is_function 和is_object 来检查一个是否像函数一样工作,如下所示:
std::is_function<decltype(f)>::value || std::is_object<decltype(f)>::value
所以我想知道是否有更好的方法来测试一个是否是 lambda?
编辑:
相关代码:
template<typename Func>
void deferJob(Func f, int ms=2000)
{
if(! std::is_function<decltype(f)>::value
&& ! std::is_object<decltype(f)>::value){
qDebug()<<"Not function!";
return;
}
QTimer* t = new QTimer;
t->setSingleShot(true);
QObject::connect(t, &QTimer::timeout,
[&f, t](){
qDebug()<<"deferJob";
f();
t->deleteLater();
});
t->start(ms);
}
EDIT2:
类似问题:C++ metafunction to determine whether a type is callable
【问题讨论】:
-
一个 lambda 对象只是一个函子。您目前如何处理函子?
-
关于你的新代码:如果
Func f没有实现f(),那么你的代码将无法编译。您实际上想使用std::enable_if之类的东西来使用此功能。 (虽然编译时错误可能被认为更好)。 -
@liuyanghejerry 你为什么要做这个测试?如果在特定实例化中
Func表示的类型上没有定义operator(),那么这是一个编译时错误,这肯定比运行时断言要好。 -
@liuyanghejerry 对在编译时验证的内容进行运行时检查是愚蠢的。如果调用
f无效,编译器不会编译f();,它会告诉你程序格式错误。 ...而@sharth 击败了我。 -
顺便说一句,编译器可以推出不错的错误消息。 Clang 3.3 报告:“错误:调用的对象类型 'int' 不是函数或函数指针”。 GCC 可以使用一些工作,但对于 “错误:表达式不能用作函数” 仍然是合理的。当我执行
deferJob(3)之类的操作时,会出现这些错误。