是否有可能有一个泛型方法,它接受两个函数f
和g
(都返回void
并接受相同类型的参数)并返回一个新函数接受与f
和g
相同类型的参数,首先将f
应用于传递的参数,然后g
?
具体来说,我想定义类似这样的内容:
template <typename FunctionType>
// FunctionType is void(ArgType1 arg1, ArgType2 arg2, ..)
FunctionType CombineTwoFunctions(FunctionType f, FunctionType g) {
// Using the lambda syntax just for illustration:
return [f, g](ArgsOf(FunctionType) args) {
f(args);
g(args);
};
}
答案 0 :(得分:2)
不是最优化的代码,但它可以工作。
的template <typename ...Args>
std::function<void(Args...)> CombineTwoFunctionsHelper(std::function<void(Args...)> f, std::function<void(Args...)> g) {
return [f, g](Args ...args) {
f(args...);
g(args...);
};
}
template <typename F1, typename F2>
auto CombineTwoFunctions(F1 f1, F2 f2) -> decltype(make_function(f1)) {
return CombineTwoFunctionsHelper(make_function(f1), make_function(f2));
}
void print1(int i, std::string s) {
std::cout << "print1 " << i << s << std::endl;
}
void print2(int i, std::string s) {
std::cout << "print2 " << i << s << std::endl;
}
int main() {
auto fg = CombineTwoFunctions(print1, print2);
fg(1, "test");
}
的帮助下
template <typename F1, typename F2>
auto CombineTwoFunctions(F1 f, F2 g) {
return [f, g](auto&& ...args) {
f(args...);
g(args...);
};
}
void print1(int i, std::string s) {
std::cout << "print1 " << i << s << std::endl;
}
void print2(int i, std::string s) {
std::cout << "print2 " << i << s << std::endl;
}
int main() {
auto fg = CombineTwoFunctions(print1, print2);
fg(1, "test");
}
您应该能够通过向参数添加(通用)引用来改进它,并转发它们以避免复制。但请注意,无法两次移动参数。
正如@ 0x499602D2在评论中所说的那样,C ++ 14让它变得更加轻松
private static IDictionary<Items,int> AssociatedValue = new Dictionary<Items,int> {
{Items.pen, 5}, {Items.watch, 4}, {Items.rubber, 1}, {Items.ruler, 8}
};