繁体   English   中英

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

[英]Get address of member function through 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;
}

该函数对于函数指针工作正常,但是当我尝试将绑定的Member函数放入混合中时,一切都变了。

我认为这是因为我将函数指针模板化为我的普通函数指针类型。 但是对于通过std :: bind绑定的成员函数,此转换将失败。

我在比较运算符中使用它来从向量中查找和删除函数。

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让我失败了。 我也想像此功能将适用于lambda,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可以检查目标等: https : //en.cppreference.com/w/cpp/utility/functional/function

您的签名将变为:

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

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

target_type()== typeid(T)

有关更多信息和一些相关示例,请参见https://en.cppreference.com/w/cpp/utility/functional/function/target

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM