Вы можете создавать только шаблоны классов или функций. Нет такой вещи, как переменные шаблоны, но (хотя говорили о том, чтобы делать что-то подобное). Один Обходной использовать шаблон класса, обеспечивающий доступ к массиву вместо:
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);
Это должно работать, но не слишком масштабируемым. Обертка массива в шаблон функции и возвращение ссылки на массив будут работать лучше: таким образом легко получить только один экземпляр массива, поскольку переменная в шаблонах функций должна быть объединена между различными экземплярами с теми же параметрами. Выписывая тип возвращаемого шаблона функции только немного неловко:
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; });
Typedefs кто-нибудь? –
@ Kerrek SB Нет typedef здесь – David
В его нынешнем виде ваш вопрос не имеет смысла. «Функциональный указатель» - это объект, а объекты - типы. Шаблон не является типом (это * шаблон *.) У вас не может быть «шаблонный объект». –