2016-03-24 7 views
0

私は2つのクラス持っ継承は

template <typename T> 
std::vector<T> getFunc(T (B::func*)()) { 
....iterator through list of B's calling func.... 
} 

の場合をI私は単純に二getFuncトンを作成することによって、問題を解決することができ、私は「何のgetFunc(::フナ)が存在しない...」というコンパイルエラー

を取得getFunc(B::funA)を呼び出そう帽子はB ::の代わりにA::func*を取るが、今は全く同じことをする2つの関数がある。 getFuncの1つの実装で終了する方法はありますか?

EDIT:プレC++ 11ソリューションが必要です。

答えて

1

単に全体のパラメータを推定し、その戻り型を抽出:

template<class F,class R=std::result_of_t<F(B&)>> 
std::vector<R> getFunc(F&&){return{};} 

std::result_of_ttypename std::result_of<F(B&)>::typeを使用し、C++ 11に適合可能な溶液のために、C++ 14です。 C++ 03解決のために

、単にクラス型推論:

template <typename T, typename C> 
std::vector<T> getFunc(T (C::*func)()); 
+0

result_of_tにはどのヘッダがありますか? #include は私にそのようなファイルを取得しません。 – mjr

+0

@mjr C++ 11を有効にします( '-std = C++ 11')。 – 0x499602D2

+0

@mjrあなたはそれを働かせることができましたか? – 0x499602D2

0

&B::funAは、タイプbool (A::*)()であり、bool (B::*)()ではありません。 static_caststatic_cast<bool (B::*)()>(&B::funA)を実行する必要があります。

+0

私「ブール(Bのタイプ 'BOOL(A :: *)()' から「無効な静的キャスト取得します。 :*)() '" – mjr

+0

@mjr http://coliru.stacked-crooked.com/a/7820920cf2ec6609 – Simple