将自由函数绑定为类成员函数
Binding free functions as class member functions
我曾尝试将自由函数绑定为类成员函数,它很有效(请参阅下面的代码(。但我对它的工作原理感到困惑,并有一些问题。
问题:
-
调用
obj_A.func_A()
与直接调用func_X()
相同?第一种方法是否在内部创建指针? -
通过
obj_A
调用这些方法是否有额外的开销? -
Class_A::func_A / B
真的是成员函数吗?它的行为就像一个静态的,因为它没有访问Class_A
成员。。。 -
这是一个奇怪的设计模式吗?有什么改进的建议吗?
#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可能不是讨论的最佳场所。目前,公开公开注入的依赖关系并不常见。您可以考虑使用代理模式,在该模式中您可以直接调用函数。这使您具有更大的灵活性。
相关文章:
- 如何使用指针传递给函数的数组中对象的函数成员
- c++构造函数成员初始化:传递参数
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 如何在C++通过公共函数访问私有函数成员?
- 解释了构造函数成员初始化列表
- 调用std::函数成员时内存损坏
- 是否可以为模板类的模板函数成员设置别名?
- 捕获 lambda 函数C++成员变量
- 构造函数成员初始值设定项跨成员列出,安全吗?
- 获取与在模板参数中传递的函数成员类型相同的类
- 如何从公共函数成员访问地图私有成员
- C 构造函数成员分配优化
- 使用命名空间进行函数成员定义
- 函数成员作为 CUDA 内核的参数
- 模板基类函数成员的别名
- 函数成员中用于void和继承的enable_if
- 头文件中是否定义了一个很长的Class函数成员
- 类内/构造函数成员初始化
- 使用指向部分专用函数成员的指针自动填充向量
- 指向函数成员的指针