Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::函数提取和删除参数_C++_C++11_C++14_Std Function_Stdbind - Fatal编程技术网

C++ std::函数提取和删除参数

C++ std::函数提取和删除参数,c++,c++11,c++14,std-function,stdbind,C++,C++11,C++14,Std Function,Stdbind,这几天我在学习c++11/14,它对我来说似乎是一门全新的语言,添加了很多新功能,但我仍然不能充分利用这些新功能: typedef std::function<void()> void_f; typedef std::function<void(int a, void_f b)> f1; typedef std::function<void(int a, std::function<void(void_f f)> c, void_f b)> f2

这几天我在学习c++11/14,它对我来说似乎是一门全新的语言,添加了很多新功能,但我仍然不能充分利用这些新功能:

typedef std::function<void()> void_f;

typedef std::function<void(int a, void_f b)> f1;
typedef std::function<void(int a, std::function<void(void_f f)> c, void_f b)> f2; // this order is wanted

std::vector<f1> v;

void add(f1 f)
{
    v.push_back(f);
}

void add(f2 f)
{
     v.push_back(f) // ?
 // I want to extract 'void_f f' argument from std::function for later use 
//and remove std::function completely to get same signature as f1
}
typedef std::函数void\u f;
typedef std::函数f1;
typedef std::函数f2;//需要这个订单
std::向量v;
无效添加(f1 f)
{
v、 推回(f);
}
无效添加(f2 f)
{
v、 向后推(f)/?
//我想从std::function中提取'void_f'参数,供以后使用
//并完全删除std::函数以获得与f1相同的签名
}
我一直在研究std::move、std::bind、std::forward、std::placeholder,但似乎找不到类似的内容。也许我应该在vector中保存较长的版本,然后将空lambda绑定为较短的版本?

不,如果需要,可以在vector中保存“较短”的f1:

typedef std::function<void()> void_f;

typedef std::function<void(int a, void_f b)> f1;
typedef std::function<void(int a, std::function<void(void_f f)> c, void_f b)> f2;

std::vector<f1> v;

void add(f1 f)
{
    v.push_back(f);
}

void add(f2 f)
{
     v.push_back([](int a, void_f b) { f(a, [](){}, b); });
} 
typedef std::函数void\u f;
typedef std::函数f1;
typedef std::函数f2;
std::向量v;
无效添加(f1 f)
{
v、 推回(f);
}
无效添加(f2 f)
{
v、 向后推([](inta,void_fb){f(a,[](){},b);});
} 

您不能“删除”f2的额外参数,但可以传递一个no-op lambda。外部lambda将剩余的参数a和b按正确的顺序排列。

您所说的“我想从std::function中提取'void\u f f'参数以供以后使用并完全删除std::function”是什么意思?a
std::function
是可以用其参数调用的东西,没有参数?为什么要从
std::function
提取函数指针?你希望它能给你什么?请注意,可能没有指向allI的函数指针。我已经更新了我的问题,以更好地反映我想要实现的目标。我只想保存在同一个向量保持器中,但也要重用std::function中的第二个参数第二个和第三个typedef没有任何意义,也不编译这是我首先做的,但随后参数完全丢失了。有什么办法可以控制它吗?@juzerKicker:哪一个论点失败了?我们提供空lambda作为第二个参数的全部原因是因为在第一个地方没有参数
F2F
需要3个参数,
vector
的用户只提供2个参数。std::function有f参数,它是lambda,可能包含手工编写的代码,用法类似于:c([]{}u some_code_here})。我想在“删除”它之前通过稍后调用no op lambda来保存它。我想一旦调用了c,我就会立即执行。@juzerKicker:高阶函数可能会让人困惑
std::function
没有
f
参数,它需要一个参数。