我想将重载函数应用于结构的所有元素,如下所示:(下面的代码不会编译)
#include <iostream>
typedef struct {
float float_val;
int int_val;
} NodeStatus;
template<typename T>
void ApplyToFields(NodeStatus *ns1, NodeStatus *ns2, void (*func)(T, T)) {
func(ns1->float_val, ns2->float_val);
func(ns1->int_val, ns2->int_val);
}
template<typename T>
void add_print(T a, T b) {
std::cout << b + a << std::endl;
}
template<typename T>
void sub_print(T a, T b) {
std::cout << b - a << std::endl;
}
int main() {
NodeStatus ns1, ns2;
ns1.float_val = 2.3;
ns2.float_val = 25.3;
ns1.int_val = 2;
ns2.int_val = 20;
ApplyToFields(&ns1, &ns2, add_print);
ApplyToFields(&ns1, &ns2, sub_print);
}
我是来自C的C ++的新手。经过一些研究,我意识到传递函数指针可能不是在C ++中执行此操作的正确方法。我感兴趣的是实现相同目的的最佳方式,而不是我提出的可能不可能的字面问题。坚持使用C ++ 03的解决方案将是理想的选择。谢谢!
答案 0 :(得分:3)
您可以创建一个包裹功能模板的函数对象(或替换它):
struct add_printer {
template<typename T>
void operator()(T a, T b) const {
add_print(a, b);
}
};
然后像这样使用它:
ApplyToFields(&ns1, &ns2, add_printer());
这将延迟重载解析,直到add_printer
operator()
ApplyToFields
在[](auto a, auto b) { add_print(a, b); }
中使用时实际实例化。
在C ++ 14中,您可以使用多态lambda:
var mail = $("#dat").contents().find("td:contains('" + name + "')" ).siblings("td:nth-child(2)").map(function() { return $(this).text(); }).get();
与函数对象不同,它几乎可以在任何地方定义,而不仅仅是在命名空间范围内。
答案 1 :(得分:1)
使用您的代码,您必须指定所需的重载:
unexpected token(s) preceding ';'
syntax error : indentifier '...'
unable to recover from previous error(s); stopping compilation".
或
ApplyToFields(&ns1, &ns2, add_print<float>);
ApplyToFields(&ns1, &ns2, sub_print<int>);
你想要的是一个通用的仿函数
ApplyToFields<float>(&ns1, &ns2, add_print);
ApplyToFields<int>(&ns1, &ns2, sub_print);