1

テンプレート化された関数ポインターの束を関数ポインターの配列に格納しようとしています。

私は試した

template<typename T> 
void (*funcptrArray[100])(typename vector<T> &a,int,int,bool (*comp)(T,T));

g ++でコンパイルエラーが発生します

** テンプレートの前にエラーが発生しました**

編集:ここで達成しようとしているのは、同じタスクに対して10個の異なるアルゴリズム(テンプレート化された関数)が与えられた場合です。異なるインスタンス化を配列に格納して、ループ内で1つずつ反復して実行できるようにしたいです

4

1 に答える 1

1

クラス テンプレートまたは関数テンプレートのみを作成できます。変数テンプレートのようなものはまだありません (しかし、そのようなことをするという話はありました)。1 つの回避策は、代わりに配列へのアクセスを提供するクラス テンプレートを使用することです。

template <typename T>
struct func_ptr {
    static void (*array[100])(std::vector<T>&, int, int, bool (*)(T, T);
};

template <typename T>
void (*func_ptr<T>::array[100])(std::vector<T>&, int, int, bool (*)(T, T);

これは機能するはずですが、スケーラブルではありません。配列を関数テンプレートにラップし、配列への参照を返すと、よりうまく機能しstaticます。関数テンプレートの変数は、同じパラメーターを持つ異なるインスタンス間でマージする必要があるため、この方法では配列のインスタンスを 1 つだけ取得するのが簡単です。関数テンプレートの戻り値の型を書き出すのは少し面倒です:

template <typename T>
void (*(&funcPtrArray())[100])(std::vector<T>&, int, int, bool (*)(T, T))
{
    static void (*array[100])(std::vector<T>&, int, int, bool (*)(T, T));
    return array;
}

C++ 11が役立つかどうか疑問に思っていましたが、そうではありません:

auto funcPtrArray() -> void (*(&)[100])(std::vector<T>&, int, int, bool (*)(T, T))
{
    ...
}

次に、関数を使用して配列を取得します。たとえば、次のようになります。

std::vector<int> vec;
funcPtrArray<int>()[12](vec, 1, 1, [](int a, int b){ return a < b; });
于 2013-09-05T22:26:40.843 に答える