0

次のようなものとして定義されている関数がたくさんあります。

template<typename T>
void myFunction1(vector<T>& vin);

ポイントは、STL ベクトルを入力して、いくつかの作業を行うということです。

最近、デフォルトのアロケーターを顧客のアロケーターに変更する必要がありました。定義を次のように変更しない限り、これはすべての機能を壊すようです:

template<typename T, typename Alloc>
void myFunction1(vector<T,Alloc>& vin);

さらに複雑にするために、すべてのケースでオーバーロードされたアロケーターを使用するわけではありません..

これは、すべての関数を 2 つの定義で書き直さなければならないということですか? 1 つはアロケータのテンプレートを使用し、もう 1 つはアロケータを使用しない定義です。これが答えではないことを本当に願っています...

4

4 に答える 4

2

より簡単な解決策は、標準ライブラリ アルゴリズムで行われているように、イテレータの観点から関数を実装することです。

template <typename Iterator>
void myFunction1(Iterator1 first, Iterator2 last) { .... }
于 2012-11-15T15:35:27.840 に答える
1

完全なクラス テンプレートを尊重する関数テンプレートが 1 つあれば十分です。仮説的には、これは次のようになります。

template <typename T, typename Alloc>
void myFunction1(std::vector<T, Alloc> & v);

アロケーターがデフォルト設定されているかどうかに関係なく、すべてのベクトルにはこれら 2 つの引数があります。

ただし、実際にはコンテナ全体をテンプレートにする方がより実りの多い方法です。

template <typename V>
void myFunction1(V & v)
{
    typedef typename V::value_type value_type;
    // ...
}
于 2012-11-15T15:36:22.270 に答える
0

関数テンプレートごとに 2 つのオーバーロードを提供する必要はありません。2 つのパラメーターを指定するだけです。std::vectorには 2 つのテンプレート パラメーターがあるため、どちらも適切に推測されます。

于 2012-11-15T15:38:05.840 に答える
0

テンプレートを変更しすぎていると思います。ただし、良いニュースは、テンプレートを次のように変更できることです。

template <typename MyVector> 
void myFunction1(MyVector& vin);
于 2012-11-15T15:33:36.597 に答える