2011-05-19 128 views
0

考慮下面的類,它只是一個內部函子f映射到一個功能稍後運行:C++仿函數模板

class A { 
private: 
    int (A::*f)(int); 
    int foo(int x) { return x; } 
    int bar(int x) { return x*2; } 
public: 
    explicit A(bool foo=true) { f = foo ? &A::foo : &A::bar; } 
    int run(int x) { return (this->*f)(x); } 
}; 

現在說我有另一個類,B

class B { 
public: 
    int foo(int) { return x*x; } 
}; 

而且功能foo

int foo(int x) { return 0; } 

我知道這是不可能有A指定並運行B::foofoo,因爲它們的原型不同:int (A::*)(int) vs int (B::*)(int) vs int (*)(int)

我在問什麼是他們的任何方式來模擬A::f,使它可以採取任何方式嗎?

回答

2

我不完全相信你想實現什麼,但你可能想看看:

6

通常,您使用這種工作的std::/boost::/std::tr1::function<int(int)>。它可以採用任何具有正確簽名的函數對象(包括指針)。您可以創建使用bind調用成員函數的函數對象,這些函數對象可用於相同的包中。

+0

我會承認不熟悉boost,聽說過它,從來沒有使用它。在我的例子中,'f'的原型是什麼樣的,以便'f'可以被賦予任何函數('A :: foo','B :: foo'和'foo')?只是'功能 f;'它將如何分配? 'f = &::foo;','B b; f =&b.foo'。 – steveo225 2011-05-19 19:00:52

+0

@ steveo225:閱讀文檔。 – Puppy 2011-05-19 19:04:28

+0

我看到現在Space_C0wb0y發佈了它 – steveo225 2011-05-19 19:07:39