2013-09-05 2 views
1

Я пытаюсь сохранить кучу шаблонных указателей функций в массиве для указания указателя.Объявление Массив указателя на функции шаблона дает ошибку компиляции

я попытался

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

дает ошибку компиляции в г ++

** Ошибка ожидается первичное выражение, прежде чем шаблон **

EDIT: Что я пытаюсь достичь здесь: Учитывая 10 различных алгоритмов (templated function), для той же задачи. Я хочу хранить разные inst antiations в массиве, чтобы я мог выполнять итерацию и запускать их один за другим в цикле

+1

Typedefs кто-нибудь? –

+0

@ Kerrek SB Нет typedef здесь – David

+0

В его нынешнем виде ваш вопрос не имеет смысла. «Функциональный указатель» - это объект, а объекты - типы. Шаблон не является типом (это * шаблон *.) У вас не может быть «шаблонный объект». –

ответ

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); 

Это должно работать, но не слишком масштабируемым. Обертка массива в шаблон функции и возвращение ссылки на массив будут работать лучше: таким образом легко получить только один экземпляр массива, поскольку переменная в шаблонах функций должна быть объединена между различными экземплярами с теми же параметрами. Выписывая тип возвращаемого шаблона функции только немного неловко:

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; }); 
+0

Спасибо, что помогает. Я все еще не понимаю, может ли быть массив шаблонов функций, заключенных внутри функции, почему вы не можете иметь его без оболочки? – David

+0

@David: Концептуально, это сработало бы, но в настоящее время вы только templatize функции и классы. Как я уже сказал, речь шла о создании переменных шаблонов. Я также мог представить себе шаблоны «enum class» (например, для установки значений некоторых элементов) и шаблонов пространства имен (все внутри шаблонизируется по типу пространства имен). Однако ни одна из этих вещей в настоящее время не разрешена. –

+0

@David note Это не массив шаблонов функций в том смысле, который вы хотите использовать, как в своем предыдущем комментарии. Это создает массив func ptrs для одного конкретного экземпляра 'T'. Например, вы создаете 100 func ptrs, которые могут ссылаться только на функции, принимающие вектор ints. Например, вы не можете назначить функцию с параметром 'vector ' и сохранить его в этом массиве. – greatwolf

Смежные вопросы