2012-02-16 18 views
3

と仮定私は、任意のコンテナタイプ(C++ 11)の上に何かをする機能を持っている:私はこのような別の関数からこの関数を呼び出すことができます他の関数に関数テンプレートを渡し

template<class containerType> 
void bar(containerType& vec) { 

     for (auto i: vec) { 
       std::cout << i << ", "; 
     } 

     std::cout << '\n'; 
} 

template<class funcType> 
void foo(funcType func) { 
    std::vector<int> vec = { 1, 2, 3 }; 
    func(vec); 
} 
:その後、fooは次のようになり、
void foo() { 
     std::vector<int> vec = { 1, 2, 3 }; 
     bar(vec); 
} 

は、今私はちょうどバーのような異なる機能を持っていると仮定し、私はFOOに、これらの機能のいずれかを渡したいです

しかし、このようFOOを呼び出す:(バーは、関数が、関数テンプレートではないので、かなり明確)

foo(bar); 

は動作しません。これにはいい解決策がありますか?この仕事をするためにfooをどのように定義する必要がありますか?

編集:ここでは、fooはint型のベクトルで動作することがわかっている場合、あなたはbar< std::vector<int> >関数を渡すことができ

#include <iostream> 
#include <vector> 
#include <list> 

template<class containerType> 
void bar(containerType& vec) { 

     for (auto i: vec) { 
       std::cout << i << ", "; 
     } 

     std::cout << '\n'; 
} 

template<typename funcType> 
void foo(funcType func) { 

     std::vector<int> vals = { 1, 2, 3 }; 
     func(vals); 

} 

int main() { 
     // foo(bar); - does not work. 
} 
+0

最小のコンパイル可能な例がありません –

+1

なぜ関数ポインタを使用しますか?私は、ファンクタを使用する方が良いと思います。 – AlexTheo

+0

@AlexTheoご意見ありがとうございます。もちろん、ファンクタを使うことは簡単です!ボブは回答と同様の解決策を投稿しました。私はそれに行くよ! – fdlm

答えて

2

これは何か? http://ideone.com/HEIAl

#include <iostream> 
#include <vector> 
#include <list> 

struct Test{ 
template<class containerType> 
static void apply(containerType& vec) { 

     for (auto it = vec.begin(); it != vec.end(); ++it) { 
       std::cout << *it << ", "; 
     } 

     std::cout << '\n'; 
} 
}; 

template<class FuncStruct> 
void foo() { 

     std::vector<int> vals; 
     vals.push_back(1); 
     FuncStruct::apply(vals); 

} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    foo<Test>(); 
    return 0; 
} 
+0

ありがとう! @AlexTheoがコメントに指摘したように、関数を使うのがおそらく最も簡単な解決法です。 – fdlm

3

...コメントで要望として、最小限のコンパイル可能例です。

fooで定義されているモジュールでは、使用するコンテナのtypedefも定義するのが妥当な解決策です。それでは、barもテンプレートにする必要はありません。

+0

あなたの答えをありがとう。私はfooの呼び出し側がfooが内部的にどのように動作するかを知らないことを望んでいます。彼は、任意のコンテナで動作する関数を渡さなければならないことを知っています。 – fdlm

+0

@fldm:編集を参照してください。 –

+1

@fdlmしかし、この関数は任意のコンテナでは動作しません。これはテンプレート関数なので、コンパイル時に必要なコンテナ型の関数を作成するものと考えてください。 – juanchopanza

4

オンラインデモを(完全に目を覚ましていない、ポイントを逃すかもしれない)これは、あなたがfoo(bar)を行うことができます。テンプレート関数またはテンプレートクラスを渡す代わりに、テンプレートメンバー関数を持つ非テンプレートクラスを渡します。

#include <iostream> 
#include <vector> 
#include <list> 

struct { 
    template<class containerType> 
    void operator() (containerType& vec) { 

     for (auto i = vec.begin(); i!=vec.end(); ++i) { 
       std::cout << *i << ", "; 
     } 

     std::cout << '\n'; 

    } 
} bar; 

template<typename funcType> 
void foo(funcType func) { 

     std::vector<int> vals = { 1, 2, 3 }; 
     func(vals); 

} 

int main() { 
     foo(bar); 
} 
関連する問題