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 放入正确的顺序。
我最近在学习 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 放入正确的顺序。