2012-03-29 32 views
0

我試圖使用std::mem_fun_ref(是的,過時 版本。下面的原因)通過代理調用成員函數。使用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

如果向代理添加'運營商T&(){return * t}',該怎麼辦? – 2012-03-29 13:08:50

+0

@KerrekSB啊,我忘了。更換代理也是不可能的。實際上,它是一個迭代器。 – pmr 2012-03-29 13:19:43

+0

爲什麼不'fn(* pa)'? – 2012-03-29 13:29:48

回答

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; 
}