2012-06-12 51 views
0

我有一個類A,它有一個成員變量vector<B>。我想定義一個名爲DoToAll(funcPtr)的函數模板,它將遍歷所有矢量並應用函數。定義接收指向其他類成員函數的成員函數模板添加應用函數

class A 
{ 
vector<B> v; 
template <?????> 
void DoToAll(f); 
loop on v and apply the member function f; 
} 

class B{ 
void f1(); 
void f2(); 
. 
. 
. 
} 

如何編寫DoToAll

+4

所以,你要重寫'的std :: for_each'? –

回答

4

你是否堅持參數必須是函數指針?否則,它可能只是

template <class F> 
void DoToAll(F f) { 
    std::for_each(v.begin(), v.end(), f); 
} 

這適用於每f st。 f(x),其中x是向量的元素,是有效的。這意味着函數指針和函數,如std::functionstd::bind都沒錯。不幸的是,它不包含成員函數指針,因爲你稱它們爲x->*f(),而不是f()。但是也可以通過將成員函數指針包裝成一個可以正確轉發呼叫的函數來克服。該標準已經提供了這樣的適配器,適合你的將是mem_fun_ref_t。您可以添加的DoToAll的重載需要函數指針:

template <class This, class Ret> 
void DoToAll(Ret (*This::f)()) { 
    std::for_each(v.begin(), v.end(), std::mem_fun_ref(f)); 
} 
+0

謝謝!我是新來的C++,可以for_each工作在成員函數?! – Tomer

+0

@Tomer:見編輯。 – jpalecek

0

如果您在此處只能使用函數,你根本不需要模板。

void DoToAll(void (*f)(B&)) { /*...*/ } 

所以,你可以寫這樣的事情

void Change(const B& what) 
{ 
    what.ChangeSomething(); 
} 
//... 
a.DoToAll(Change) // or a.DoToAll(&Change)