我正在尝试使用std::mem_fun_ref
(是的,已弃用
版。以下原因通过代理调用成员函数。
template<typename T>
struct proxy {
T& operator*() { return *t; }
T* operator->() { return t; }
// no address of etc
T* t;
};
struct A {void foo() {}};
int main()
{
A a;
proxy<A> pa = {&a};
std::mem_fun_ref_t<void, A>
fn = std::mem_fun_ref(&A::foo);
fn(pa); // borks
return 0;
}
这适用于C ++ 11 std::mem_fn
但不适用boost::mem_fn
,但是
我不能同时使用这些,因为我需要指定类型
另一个地方的粘合剂和所得粘合剂的类型是
未指定boost::mem_fn
。如果可以的话,这不会是一个问题
使用decltype
但我不能,因为代码需要兼容
C ++ 03
解决这个问题最简单的方法是什么?一个习俗
mem_fun_through_proxy
?
编辑:另一个警告是proxy
类无法更改。
答案 0 :(得分:0)
正如乔治推荐的那样,我实施了自己的解决方案。这是简短版本:
// snipped solution: does not include const version and hack for void
// returns
#include <functional>
namespace mine {
template<typename Ret, typename T>
class mem_fun_ref_t : public std::unary_function<T, Ret>
{
public:
explicit
mem_fun_ref_t(Ret (T::*f)())
: f(f) { }
template<typename U>
Ret
operator()(U& u) const
{ return (*u.*f)(); }
Ret
operator()(T& t) const
{ return (t.*f)(); }
private:
Ret (T::*f)();
};
} // mine
template<typename T>
struct proxy {
T& operator*() { return *t; }
T* operator->() { return t; }
// no address of etc
T* t;
};
struct X {
int foo() {return 23;}
};
int main()
{
mine::mem_fun_ref_t<int, X> fn(&X::foo);
X x;
// normal
fn(x);
proxy<X> px = {&x};
fn(px);
return 0;
}