我目前正在阅读几本书以抓住C++ 14的特性。我正在尝试使用可变参数模板将参数绑定到函数。我知道如何使用std :: bind来做到这一点,但我也想用C++ 14 lambda表达式来实现这个功能,只是为了常识和理解,以及任何可能的性能优势。我读过lambda表达式可以内联,而std :: bind不能内联,因为它通过调用函数指针发生。C++ 14函数绑定的可变参数lambda捕获
下面是从myFunctions.h代码:
#include <functional>
int simpleAdd(int x, int y) {
return x + y;
}
//function signatures
template<class Func, class... Args>
decltype(auto) funcBind(Func&& func, Args&&...args);
template<class Func, class... Args>
decltype(auto) funcLambda(Func&& func, Args&&...args);
/////////////////////////////////////////////////////////////////
//function definitions
template<class Func, class... Args>
inline decltype(auto) funcBind(Func&& func, Args&&... args)
{
return bind(forward<Func>(func), forward<Args>(args)...);
}
template<class Func, class ...Args>
inline decltype(auto) funcLambda(Func && func, Args && ...args)
{ //The error is caused by the lambda below:
return [func, args...]() {
forward<Func>(func)(forward<Args>(args)...);
};
}
这里是我运行的主要代码:
#include<iostream>
#include<functional>
#include "myFunctions.h"
using namespace std;
int main()
{
cout << "Application start" << endl;
cout << simpleAdd(5,7) << endl;
auto f1 = funcBind(simpleAdd,3, 4);
cout << f1() << endl;
//error is occurring below
auto f2 = funcLambda(simpleAdd, 10, -2);
cout << f2() << endl;
cout << "Application complete" << endl;
错误C2665 '的std ::前进':没有2个重载可以转换所有的参数类型
错误C2198 'INT(__cdecl &)(INT,INT)':呼叫
参数太少我认为错误可能发生在可变参数被转发到lambda时,但我并不确定。
我的问题是我如何正确地制定这段代码,以便我可以使用lambda捕获函数及其参数,并在稍后调用它。
谢谢你的回答。使用lambda捕获作为使用std :: bind的复杂性比我期待的要复杂得多。从cppreference.com申请和调用,但我收到一些更多的编译器错误:错误\t C2893 \t无法专门化func (_Callable &&,_ Types && ...)',以及错误\t C2975 \t'_Size':'std :: make_index_sequence'的无效模板参数,预期的编译时常量表达式。稍后我会再看一遍,但现在我会坚持使用绑定。 –