【发布时间】:2016-01-08 17:38:27
【问题描述】:
我有以下 C++ 程序:
#include <iostream>
#include <functional>
template<class T> void fun(T t) {
if (t) std::cout << t();
else std::cout << "no t";
}
int main() {
std::function<int ()> f;
fun(f); //The check will evaluate to false
fun([](){return "hello";});
int x = 2;
fun([x](){return x;}); // Compiler error
return 0;
}
但它不能编译。问题似乎是捕获某些东西的 lambda 被转换为仿函数对象,而仿函数对象又不能转换为 bool,因此无法检查其真实性。
写fun 的正确方法是什么,这样我就可以保留main 的原样?有没有办法在保持简单的同时做到这一点(即不专门化fun)?
编辑:我真的只关心检查t 是否为真,我很高兴假设T 是可调用类型,而无需明确检查。
【问题讨论】:
-
你会发现更多的搜索网络:“c++ is_callable”
-
我读了另一个问题,虽然它很相似,但我认为它并不完全相同。这个问题实际上是关于测试某些东西是否是可调用的。就我而言,我知道 T 是可调用类型,但我想知道是否提供了实际的可调用对象。例如,在上面的代码中, f 是可调用的,但是是“空的”。我将编辑问题以使其更清楚。