通过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;
}
此函数适用于函数指针,但当我尝试将绑定的成员函数混入其中时,一切都变得糟糕。
我认为这是因为我将函数指针模板化为我的普通函数指针类型。但是对于通过 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 让我失望了。我还想象这个函数将适用于 lambdas,sorta。只要编译器尝试优化和组合相似的 lambda 表达式。
那么如何通过bind获取成员函数指针的地址呢?还是有更好的方法? (除了命名)也许,我应该把我的函数包装在一个宏中来存储枚举类型来进行比较吗?
Class参考资料:
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) {
更新:你的目标提取的问题是你提供了一个普通函数的签名作为模板参数——这不适用于更多 'advanced'函数对象、绑定等。您必须提供正确的类型,以便:
target_type() == typeid(T)
有关详细信息和一些相关示例
,请参阅https://en.cppreference.com/w/cpp/utility/functional/function/target
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;
}
此函数适用于函数指针,但当我尝试将绑定的成员函数混入其中时,一切都变得糟糕。
我认为这是因为我将函数指针模板化为我的普通函数指针类型。但是对于通过 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 让我失望了。我还想象这个函数将适用于 lambdas,sorta。只要编译器尝试优化和组合相似的 lambda 表达式。
那么如何通过bind获取成员函数指针的地址呢?还是有更好的方法? (除了命名)也许,我应该把我的函数包装在一个宏中来存储枚举类型来进行比较吗?
Class参考资料:
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) {
更新:你的目标提取的问题是你提供了一个普通函数的签名作为模板参数——这不适用于更多 'advanced'函数对象、绑定等。您必须提供正确的类型,以便:
target_type() == typeid(T)
有关详细信息和一些相关示例
,请参阅https://en.cppreference.com/w/cpp/utility/functional/function/target