将自由函数绑定为类成员函数

Binding free functions as class member functions

本文关键字:函数 成员 绑定 自由      更新时间:2023-10-16

我曾尝试自由函数绑定为类成员函数,它很有效(请参阅下面的代码(。但我对它的工作原理感到困惑,并有一些问题。

问题:

  1. 调用obj_A.func_A()与直接调用func_X()相同?第一种方法是否在内部创建指针?

  2. 通过obj_A调用这些方法是否有额外的开销?

  3. Class_A::func_A / B真的是成员函数吗?它的行为就像一个静态的,因为它没有访问Class_A成员。。。

  4. 这是一个奇怪的设计模式吗?有什么改进的建议吗?

#include <string>
#include <iostream>
using namespace std;
// define some (reference to) functions signatures types
using func_A_t = int (&)(const string &);
using func_B_t = double (&)(int, int);
// class that has two "methods" (func_A, func_B) whose definition come externally
class Class_A {
public:
string name;

// function members as references?
func_A_t& func_A;
func_B_t& func_B;
Class_A(string arg_name, func_A_t& arg_func_A, func_B_t& arg_func_B):
name{arg_name},
func_A{arg_func_A},
func_B{arg_func_B}
{
}
};
// external 'free' function
int func_X(const string& s) {
return s.size();
}
// external 'free' function
double func_Y(int a, int b) {
return 1.75 * a * b;
}
int main(int argc, char **argv) {
// contruct obj_A, binding the free functions (func_X, func_Y) as Class_A member functions
Class_A obj_A{"crazy test", func_X, func_Y};

int r1 = obj_A.func_A("Hello");
cout << "r1=" << r1 << "n";
double r2 = obj_A.func_B(5, 7);
cout << "r2=" << r2 << "n";
return 0;
}

调用obj_A.func_A()和直接调用func_X()是一样的?

第一种方法是否在内部创建指针?

是(假设你的意思是"在构造函数中"(

通过obj_A调用这些方法是否有额外的开销?

是。一个额外的间接级别是可能的,尽管编译器可能会根据你如何使用它来优化它

Class_A::func_A/B真的是成员函数吗?

不,它们是成员变量,恰好是函数指针

这是一种奇怪的设计模式吗?

这是主观的,但我认为不是。它在依赖注入体系结构中被大量使用。例如,注入如何获得数据库句柄的详细信息。

有什么改进建议吗?

我们需要一个非常具体的用例来提供指导。StackOverflow可能不是讨论的最佳场所。目前,公开公开注入的依赖关系并不常见。您可以考虑使用代理模式,在该模式中您可以直接调用函数。这使您具有更大的灵活性。