相关疑难解决方法(0)

是否可以编写模板来检查函数的存在?

是否可以编写一个模板来改变行为,具体取决于是否在类上定义了某个成员函数?

这是我想写的一个简单例子:

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"部分.

c++ templates sfinae template-meta-programming

458
推荐指数
20
解决办法
14万
查看次数

指向成员函数的指针的实际用途是什么?

我已经阅读了这篇文章,我从中得到的是,当你想调用指向成员函数的指针时,你需要一个实例(指向一个或一个堆栈引用的指针)并调用它:

(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)

c++ member-functions

13
推荐指数
3
解决办法
2265
查看次数