Определить тип аргумента из аргумента функции шаблона

Я привык к шаблонам C++ и программированию для переносимого кода (MSVC, XCode...). В упрощенном виде я написал функцию

template <typename T, void (*FUNC)(T, T)>
void ApplyFuncOnBuffer(T* buffer, int count) { /* ... */ }

и код шаблона вызывающего абонента похож на

template <typename A>
void Process(A val1, A val2) { /* ... */ }

template <typename A>
void ProcessBuffer(A* buffer, int count)
{
    ApplyFuncOnBuffer<A, &Process>(buffer, count);
}

Это хорошо, он компилируется и работает, но я хотел бы упростить вызов из

ApplyFuncOnBuffer<A, &Process>(buffer, count);

to

ApplyFuncOnBuffer<&Process>(buffer, count);

Это означает найти способ определить T из аргумента шаблона FUNC. Я искал и пробовал решения, но «шаблонизировал» аргумент FUNC.

template <template <typename T> void (*FUNC)(T, T)>
void ApplyFuncOnBuffer(T* buffer, int count) { /* ... */ }

Компилятор MSVC говорит:

error C2988: unrecognizable template declaration/definition
error C2059: syntax error : '<L_TEMPLATEDECL>'
error C2143: syntax error : missing ',' before '<end Parse>'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

Что глобально говорит о том, что синтаксис неверен.

Наконец, мой вопрос: кто-нибудь знает какой-нибудь правильный синтаксис, который позволяет определить тип T из аргумента шаблона FUNC без необходимости добавлять его явно в качестве аргумента шаблона ApplyFuncOnBuffer?


person domalb    schedule 30.07.2015    source источник
comment
Вы ищете функцию, которая еще не включена в язык, но уже была предложена: open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3601.html   -  person Columbo    schedule 30.07.2015
comment
Даже если черта действительно получает T от FUNC, ваш шаблон будет template <typename F, F f> void ApplyFuncOnBuffer(extractT<FUNC>* buff, int count) с ApplyFuncOnBuffer<decltype(&Process), &Process>(buffer, count); :/   -  person Jarod42    schedule 30.07.2015
comment
Не могли бы вы вместо этого передать FUNC в качестве аргумента?   -  person Jarod42    schedule 30.07.2015
comment
@Columbo О, чувак, еще одно другое использование using. Знаете, каков статус этой бумаги?   -  person Barry    schedule 30.07.2015
comment
@ Барри К сожалению, нет. Я бы написала автору.   -  person Columbo    schedule 30.07.2015


Ответы (1)


кто-нибудь знает допустимый синтаксис, который позволяет определить тип T из аргумента шаблона FUNC без необходимости добавлять его явно в качестве аргумента шаблона ApplyFuncOnBuffer?

Нет такой удачи. Как указывает Columbo, есть предложение, которое в конечном итоге позволит вам делать то, что вы хотите. Но до тех пор у вас есть три варианта:

  1. Придерживайтесь многословия:

    ApplyFuncOnBuffer<A, &Process>(buffer, count);
    
  2. Напишите макрос (вздрагивает), чтобы вытащить A для вас.

    #define APPLY(func) get_arg_type_t<func>, func
    ApplyFuncOnBuffer<APPLY(&Process)>(buffer, count);
    
  3. Если возможно, возьмите указатель на функцию в качестве аргумента:

    template <typename T>
    void ApplyFuncOnBuffer(T*, void (*)(T, T), int );
    
    ApplyFuncOnBuffer(buffer, Process, count);
    

Выбирайте оружие с умом.

person Barry    schedule 30.07.2015
comment
Спасибо за ответы. Я рассмотрю прохождение в качестве аргумента. - person domalb; 30.07.2015