クラス テンプレートまたは関数テンプレートのみを作成できます。変数テンプレートのようなものはまだありません (しかし、そのようなことをするという話はありました)。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; });