这些天我正在学习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绑定为更短的版本?
答案 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放入正确的顺序。