如何在不解析的情况下将重载函数指针作为参数传递 (C++03)
How to pass an overloaded function pointer as an argument without resolving (C++03)
我想将重载函数应用于结构的所有元素,如下所示: (下面的代码将无法编译)
#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 的解决方案将是理想的。谢谢!
您可以创建一个函数对象来包装函数模板(或替换它):
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
中使用时实际实例化。
在 C++14 中,您可以使用多态 lambda: [](auto a, auto b) { add_print(a, b); }
与函数对象不同,它几乎可以在任何地方定义,而不仅仅是在命名空间范围内。
使用代码,您必须指定所需的重载:
ApplyToFields(&ns1, &ns2, add_print<float>);
ApplyToFields(&ns1, &ns2, sub_print<int>);
或
ApplyToFields<float>(&ns1, &ns2, add_print);
ApplyToFields<int>(&ns1, &ns2, sub_print);
演示
你想要的是一个通用函子
template<typename F>
void ApplyToFields(const NodeStatus &ns1, const NodeStatus &ns2, F func) {
func(ns1.float_val, ns2.float_val);
func(ns1.int_val, ns2.int_val);
}
struct add_print
{
template<typename T>
void operator() (T a, T b) {
std::cout << b + a << std::endl;
}
};
演示
相关文章:
- 如何正确编写指针函数声明?
- C++常规指针函数或模板
- 如何重新定义 C++ 指针函数?
- C++ 指向其他类函数的指针函数
- 指针到指针函数参数
- 将指向成员的指针函数传递到模板中
- C++ 在 none 常量指针函数中返回一个常量指针
- 如何使用指针函数编写/读取数组
- 是C 中的函数指针函数对象
- 如何从另一个类调用指向成员的指针函数
- 如何声明采用指向成员的指针函数的函数
- 如何构造一个以可变参数指针函数作为成员的类?
- c 通过值或指针函数语法
- 将typedef方法作为指针函数传递
- 从 Main 中的双指针函数打印出指针数组
- strcpy 对指针函数的引用
- 这是否仍然声明一种指针函数的别名?
- 将指向成员的指针函数与 std::shared_ptr 结合使用
- 'Incomplete type' 为标准::函数声明指向成员的指针函数模板参数时出错
- 从注入进程的 DLL 调用函数并更改指针函数的地址