std::function 提取并删除参数

std::function extract and remove argument

我最近在学习 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?

不,如果需要,您可以将 "shorter" 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); });
} 

您不能 "remove" f2 的额外参数,但您可以传递空操作 lambda。外层 lambda 将剩余的参数 a 和 b 放入正确的顺序。