通过std :: bind获取成员函数的地址


size_t getAddress(F f) {
    typedef void (fnType)(Ts...);
    fnType ** fnPointer = f.template target<fnType*>();
    if (fnPointer == nullptr) { //Must be member function.
        //Code to get address of member function pointer
    }
    return (size_t)*fnPointer;
}

此功能适用于功能指针,但是当我尝试将绑定的成员函数投入到组合中时,一切都向南。

我认为这是因为我将功能指针作为我的普通函数指针类型。但是,通过od键函数通过std ::绑定此转换失败。

我在比较运算符中使用它来查找和删除向量的功能。

EventObject<Ts...>& operator-=(const F& rhs) {
    int i = 0;
    for (auto const& value : callbacks) {
        if (getAddress(rhs) == getAddress(value)) {
            erase(i);
            break;
        }
        i++;
    }
    return *this;
}

Google使我失败了。我还认为此功能适用于Lambdas,Sorta。只要编译器试图优化并结合类似的lambda表达式。

那么,如何通过绑定获得成员函数指针的地址?还是有更佳的方法?(除了命名)也许,我应该将功能包裹在宏中以存储枚举类型以进行比较吗?

类信息供参考:

template <typename...Ts>
class EventObject{
public:
    typedef std::function<void(Ts...)> F;
    typedef std::vector<F> CallBack;
    Callback callbacks;

您应该切换到使用std::function而改(更新:事实证明您已经做到了)。std::function是一种通用多态性功能包装器,它将接受原始功能指针,绑定等。这样,您需要以某种方式进行比较的标准化方法,但是std::function可以检查目标等。P>

您的签名变为:

EventObject<Ts...>& operator-=(const std::function<R(Args...)>& rhs) {

更新:目标提取的问题是,您提供了一个普通函数作为模板参数的签名 - 这对更"高级"功能对象,绑定等不起作用。必须提供正确的类型,以便:

target_type()== typeid(t)

请参阅https://en.cppreference.com/w/cpp/utility/functional/function/target有关更多信息,> >

最新更新