0

我正在尝试编写一个宏来使 C++ 中回调的特定用法更容易。我所有的回调都是成员函数,并将this作为第一个参数和第二个参数,其类型继承自一个公共基类。

通常的方法是:

register_callback(boost::bind(&my_class::member_function, this, _1));

我很想写:

register_callback(HANDLER(member_function));

请注意,它将始终在同一类中使用。

即使typeof被认为是一种不好的做法,这听起来也可以很好地解决缺少__class__宏来获取当前类名的问题。

以下代码有效:

typedef typeof(*this) CLASS;
boost::bind(& CLASS :: member_function, this, _1)(my_argument);

但我不能在宏中使用此代码,它将作为register_callback.

我试过了:

#define HANDLER(FUN)                                           \
    boost::bind(& typeof(*this) :: member_function, this, _1);

由于我不明白的原因,这不起作用。引用 GCC 文档:

typeof可以在任何可以使用 typedef 名称的地方使用 -construct 。

我的编译器是 GCC 4.4,即使我更喜欢标准的东西,也可以接受特定于 GCC 的解决方案。

4

1 回答 1

1

您的问题可能是 typeof yield my_class&。它似乎适用于boost::remove_reference

#include <boost/bind.hpp>
#include <boost/type_traits.hpp>
#include <iostream>

struct X
{
    void foo(int i) { std::cout << i << '\n'; }
    void bar() {boost::bind(&boost::remove_reference<typeof(*this)>::type::foo, this, _1)(10); }
};

int main()
{
    X x;
    x.bar();
}

它可能更便于使用BOOST_TYPEOF,并且在 C++0x中使用decltype

于 2010-03-13T12:11:58.503 回答