C++11 使用传入构造函数C+的lambda初始化类+;11 让我们考虑下面的例子: #include <functional> #include <iostream> using namespace std; class Caller { public: Caller(function<void()> callback) { callback(); } }; main() { #if defined(ONELINER) Caller caller = [] { cout << "test"; }; #else function<void()> fun = [] { cout << "test"; }; Caller caller(fun); #endif // defined(ONELINER) }

C++11 使用传入构造函数C+的lambda初始化类+;11 让我们考虑下面的例子: #include <functional> #include <iostream> using namespace std; class Caller { public: Caller(function<void()> callback) { callback(); } }; main() { #if defined(ONELINER) Caller caller = [] { cout << "test"; }; #else function<void()> fun = [] { cout << "test"; }; Caller caller(fun); #endif // defined(ONELINER) },c++11,constructor,std-function,C++11,Constructor,Std Function,我理解这是因为存在从lambda到std::function的隐式转换,然后是从std::function到Caller的隐式转换,我们不能同时执行两个转换 是否有可能使syntaxClass object=lambda工作?我这么问是因为我最近出于教育原因编写了自己的小型测试框架,我认为: UNIT_TEST(test_name) { // test content }; 比你想象的要优雅得多 UNIT_TEST_BEGIN(test_name) // unit test UNIT_

我理解这是因为存在从lambda到
std::function
的隐式转换,然后是从
std::function
Caller
的隐式转换,我们不能同时执行两个转换

是否有可能使syntax
Class object=lambda工作?我这么问是因为我最近出于教育原因编写了自己的小型测试框架,我认为:

UNIT_TEST(test_name) {
  // test content
};
比你想象的要优雅得多

UNIT_TEST_BEGIN(test_name)
  // unit test
UNIT_TEST_END()
前者可以通过将lambda传递到
UnitTest
构造函数中来实现。但对于我描述的问题,我不得不使用肮脏的解决方法,如:

#define UNIT_TEST(test_name) \
    ::std::function<void(::Helper*)> test_name_helper; \
    ::UnitTest test_name ## _test = \
        test_name_helper = \
        [&] (::Helper* helper)
#定义单元测试(测试名称)\
::std::功能测试\名称\助手\
::单元测试测试名称###测试=\
测试\u名称\u帮助程序=\
[&](::Helper*Helper)

而且看起来一点也不优雅。但即使这可以在没有lambdas的情况下完成,我仍然很好奇
Class object=lamda语法。

修改构造函数,如下所示:

template<typename CB>
Caller(CB callback) {
  callback();
}
模板
呼叫方(CB回调){
回调();
}
这将允许它接受任何可调用的参数,可以是lambda、
std::function
、函数指针或functor


不幸的是,构造函数也会接受任何其他类型,但是当
回调
不能像函数那样“调用”时,会给出一个编译器错误。

大多数带有可调用参数的标准函数都使用模板。您能详细说明一下吗<代码>标准::函数
毕竟是一个模板,所以我想你脑子里有一些特定的用例?太棒了!它是如此简单,我现在觉得自己像个傻瓜。另一方面:快速搜索表明,接受一切问题也可以通过正确的静态断言()来解决。TBH如果在初始值设定项列表中使用
callback
来初始化
std::function<>
,您将立即得到一个合理的错误。您不需要额外的静态断言。
template<typename CB>
Caller(CB callback) {
  callback();
}