是否可以编写一个模板来改变行为,具体取决于是否在类上定义了某个成员函数?
这是我想写的一个简单例子:
template<class T>
std::string optionalToString(T* obj)
{
if (FUNCTION_EXISTS(T->toString))
return obj->toString();
else
return "toString not defined";
}
Run Code Online (Sandbox Code Playgroud)
所以,如果class T已经toString()确定的话,就使用它; 否则,它没有.我不知道怎么做的神奇部分是"FUNCTION_EXISTS"部分.
我已经阅读了这篇文章,我从中得到的是,当你想调用指向成员函数的指针时,你需要一个实例(指向一个或一个堆栈引用的指针)并调用它:
(instance.*mem_func_ptr)(..)
or
(instance->*mem_func_ptr)(..)
Run Code Online (Sandbox Code Playgroud)
我的问题是基于这样的:既然你有实例,为什么不直接调用成员函数,如下所示:
instance.mem_func(..) //or: instance->mem_func(..)
Run Code Online (Sandbox Code Playgroud)
指向成员函数的指针的合理/实际用途是什么?
[编辑]
我正在玩X-development并进入我正在实现小部件的阶段; 用于将X事件转换为我的类和小部件的事件循环线程需要在每个小部件/窗口的事件到达时为每个小部件/窗口启动线程; 为了做到这一点,我认为我需要在我的类中使用事件处理程序的函数指针.
不是这样的:我发现的是,通过简单地使用虚拟基类,我可以以更清晰和更整洁的方式做同样的事情.无需任何指向成员函数的指针.正是在开发上述内容时,出现了对成员函数指针的实际可用性/含义的疑问.
一个简单的事实是,您需要引用一个实例才能使用member-function-pointer,这样就不需要了.
[编辑 - @sbi和其他人]
这是一个示例程序来说明我的观点:(特别注意'Handle_THREE()')
#include <iostream>
#include <string>
#include <map>
//-----------------------------------------------------------------------------
class Base
{
public:
~Base() {}
virtual void Handler(std::string sItem) = 0;
};
//-----------------------------------------------------------------------------
typedef void (Base::*memfunc)(std::string);
//-----------------------------------------------------------------------------
class Paper : public Base
{
public:
Paper() {}
~Paper() {}
virtual void Handler(std::string sItem) { std::cout << "Handling paper\n"; }
};
//-----------------------------------------------------------------------------
class Wood : public Base
{
public:
Wood() {} …Run Code Online (Sandbox Code Playgroud)