将 N-arg 函数包装到另一个函数中
Wrap N-arg function into another function
我有一个函数在工作线程中执行另一个函数:
void run_in_worker_thread( std::function< void( ) > proc )
现在我想实现 schedule() 函数,它将 proc() 函数作为参数和 returns 函数通过 run_in_worker_thread().
在工作线程中执行 proc()
这是我的实现:
#include <iostream>
#include <functional>
using namespace std;
class Test
{
public:
void run_in_worker_thread( std::function< void( ) > proc )
{
std::cout << "execute in worker thread\n";
proc();
}
template < class... TArgs >
std::function< void( TArgs... ) >
schedule( std::function< void( TArgs... ) > proc )
{
std::function< void( TArgs... ) > f
= [this, proc]( TArgs... args ) { run_in_worker_thread( [=]( ) { proc( args... ); } ); };
return f;
}
};
int main()
{
Test test;
std::function<void(int, int)> my_funciton =
[](int a, int b) {std::cout << "got " << a << " and " << b << "\n";};
auto f2 = test.schedule( my_funciton );
f2(1, 2);
return 0;
}
问题是我的 schedule() 需要 std::function 作为参数。例如,以下调用会导致编译错误:
auto my_funciton = [](int a, int b) {std::cout << "got " << a << " and " << b << "\n";};
auto f2 = test.schedule( my_funciton );
问题是 std::function
是可调用对象的多态包装器。 Lambda 不是 std::function
。就像字符串文字不是 std::string
一样。在您的第一个示例中,您这样做:
std::function<void(int, int)> my_funciton =
[](int a, int b) {std::cout << "got " << a << " and " << b << "\n";};
您正在从 lambda 构建 std::function
。 schedule
函数能够毫无问题地推导出函数的签名。
在你的第二个例子中,你这样做:
auto my_funciton = [](int a, int b) {std::cout << "got " << a << " and " << b << "\n";};
然后你会得到一个错误,因为 std::function<void (Args...)>
无法与 lambda 匹配。解决方案是允许 schedule
接受任何可调用对象,而不仅仅是 std::function
.
template <typename Func>
auto schedule(Func proc) {
return [this, proc](auto... args) {
run_in_worker_thread([=]() {
proc(args...);
});
};
}
我有一个函数在工作线程中执行另一个函数:
void run_in_worker_thread( std::function< void( ) > proc )
现在我想实现 schedule() 函数,它将 proc() 函数作为参数和 returns 函数通过 run_in_worker_thread().
在工作线程中执行 proc()这是我的实现:
#include <iostream>
#include <functional>
using namespace std;
class Test
{
public:
void run_in_worker_thread( std::function< void( ) > proc )
{
std::cout << "execute in worker thread\n";
proc();
}
template < class... TArgs >
std::function< void( TArgs... ) >
schedule( std::function< void( TArgs... ) > proc )
{
std::function< void( TArgs... ) > f
= [this, proc]( TArgs... args ) { run_in_worker_thread( [=]( ) { proc( args... ); } ); };
return f;
}
};
int main()
{
Test test;
std::function<void(int, int)> my_funciton =
[](int a, int b) {std::cout << "got " << a << " and " << b << "\n";};
auto f2 = test.schedule( my_funciton );
f2(1, 2);
return 0;
}
问题是我的 schedule() 需要 std::function 作为参数。例如,以下调用会导致编译错误:
auto my_funciton = [](int a, int b) {std::cout << "got " << a << " and " << b << "\n";};
auto f2 = test.schedule( my_funciton );
问题是 std::function
是可调用对象的多态包装器。 Lambda 不是 std::function
。就像字符串文字不是 std::string
一样。在您的第一个示例中,您这样做:
std::function<void(int, int)> my_funciton =
[](int a, int b) {std::cout << "got " << a << " and " << b << "\n";};
您正在从 lambda 构建 std::function
。 schedule
函数能够毫无问题地推导出函数的签名。
在你的第二个例子中,你这样做:
auto my_funciton = [](int a, int b) {std::cout << "got " << a << " and " << b << "\n";};
然后你会得到一个错误,因为 std::function<void (Args...)>
无法与 lambda 匹配。解决方案是允许 schedule
接受任何可调用对象,而不仅仅是 std::function
.
template <typename Func>
auto schedule(Func proc) {
return [this, proc](auto... args) {
run_in_worker_thread([=]() {
proc(args...);
});
};
}