2016-07-30 8 views
2

対私はタイプClazzのオブジェクトに作用し、それらの間の唯一の違いは、私は彼らのメンバーにアクセスする方法である二つの機能を持っていますvを使用しないコードをアウトソースし、単純なラッパー関数を書くことは実用的です。私は単純に1つのベクトル型をループ内の他のベクトル型に変換し、関数の標準化されたバージョンに新しいベクトルを渡すことができますが、私は両方のバリアントをサポートする高速なソリューションが必要です。関数の引数:それは不可能です</p> <pre><code>void foo(vector<Clazz*>& v) { ... v[0]->method(); ... } void foo(vector<Clazz>& v) { ... v[0].method(); ... } </code></pre> <p>/:ベクトル<Clazz*>&ベクトル<Clazz>&

両方の関数をマージする方法はありますか、両方の入力タイプの柔軟性を保持していますか?

答えて

4

はい。これはテンプレート関数のためのものです。

「あなたのメンバーにアクセスする方法」を何とか抽象化しなければなりません。おそらく、メンバーにアクセスするための抽象的な手段を提供する追加のテンプレートlambdaパラメーターを介して。または、おそらく、ヘルパーの過負荷によって。

Clazz &gimme(Clazz &c) { return c; } 

Clazz &gimme(Clazz *c) { return *c; } 

その後、テンプレート機能を持っている:

template<typename vector_t> void foo(vector_t & v) 

...ベクトル内の各メンバーにアクセスするためにgimme(v[n])を呼び出します。

関連する問題