指向非静态方法的指针的C++有用性
C++ usefulness of a pointer to non-static method
正如我所理解的指向非静态方法的指针一样,它们只不过是为某个方法提供别名机制。例如,有一个对象有三种方法
class Provider
{
public:
int A(int in);
int B(int in);
int C(int in);
}
以及需要指向提供者方法(可以是a、B或C)的指针的消费者。有了一个控制器,它为所谓的使用者提供了一个指向3种方法之一的指针,我们可以在使用者代码中编写一些东西,使用Provider实例和指向a、B或C的指针,这取决于控制器发送的内容。
如果这就是C++中指向非静态方法的指针所能做的一切,那么还有没有一种方法可以为对象的方法提供一个更"智能"的指针,而不将对象和方法指针一起发送给使用者?在肯定的情况下,习语/机制叫什么(即使是模拟它的方法也可以作为我感兴趣的答案)。
成员函数指针的概念通常是正确的。
成员函数指针实际上对于连接到此类帮助程序(如std::bind
或std::function
)非常有用。原始成员函数指针通常很难看。
就你的例子而言,
您的使用者可以接受std::function<return_type(args)>
,并且您可以将对象及其成员函数的绑定传递给这样的使用者。
诸如CCD_ 4之类的结构也允许实现诸如部分专业化和currying之类的概念。
"指向成员函数的指针"的全部意义在于,您可以在(正确类的)任何对象上调用命名方法。因此,不,没有办法在指针内"隐藏"对象引用。
你总是可以为这样的东西编写自己的包装;这就是C++的各种回调机制所做的,以便为手头的应用程序提供更方便的API。
您不必将指向对象的指针与要调用的方法的指针粘合在一起,您可以随时提供指向实例的指针,即:
class CClass {
public:
void func(int a) {}
};
///
std::function<void(CClass&, int)> call_func = &CClass::func;
///
CClass cls1;
CClass cls2;
call_func(cls1, 1);
call_func(cls2, 2);
相关文章:
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 如何更改唯一指针向量的可见性
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 混叠和指针互转换性
- 具有智能指针的多态性
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 无法初始化已知大小的矢量指针,该大小不会因多态性而更改
- 如何调用指针类型的方法(禁用多态性)?
- 使用指针向量(带代码)C++(以及对其使用的便利性的怀疑)时出现问题
- 为什么const_cast删除指针的恒常性,而不删除指向常量的指针的恒常性?
- 创建基类指针的向量并将派生类对象传递给它(多态性)
- 将指向数据成员的指针传递给 std::invoke 时有哪些用例和有用性?
- KeyEqual 在 std::unordered_set/std::unordered_map 中的有用性
- std::make_pair 和 std::make_tuple 在 C++17 中的有用性
- 自C 11以来,挥发性在并发编程中的有用性
- 函数和函数指针等效性
- 指向非静态方法的指针的C++有用性
- 除了执行外部程序之外,fork()的有用性
- 'rand()' 的有用性 - 或者谁应该称呼 'srand()'
- 可视化的一个MS扩展到c++的有用性