std :: function提取并删除参数

时间:2015-08-11 19:45:54

标签: 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; // 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
}

我一直在关注std :: move,std :: bind,std :: forward,std :: placeholders,但我似乎无法找到这样的东西。也许我应该在vector中保存更长的版本,然后将空的lambda绑定为更短的版本?

1 个答案:

答案 0 :(得分:1)

不,你可以保存&#34;更短的&#34;如果你想要的话,向量中的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); });
} 

你无法删除&#34; f2的额外参数,但你可以通过一个无操作的lambda。外部lambda将剩余的参数a和b放入正确的顺序。