2015-07-30 2 views
0

Я привык к шаблонам 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); 

в

ApplyFuncOnBuffer<&Process>(buffer, count); 

Что значит найти способ определения Т из FUNC аргумента шаблона я искал и пробовал решение, но «templatizing» аргумент 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?

+3

Вы ищете функцию, которая еще не включена в язык, но уже была предложена: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3601. html – Columbo

+0

Даже с признаком получите 'T' из' FUNC', ваш шаблон будет 'template void ApplyFuncOnBuffer (extractT * buff, int count)' с 'ApplyFuncOnBuffer (buffer, count); ':/ – Jarod42

+0

Не могли бы вы передать аргумент FUNC'? – Jarod42

ответ

0

Кто-нибудь знает какой-то действительный синтаксис, который позволяет определить тип 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); 
    

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

+0

Спасибо за ответы. Я буду рассматривать в качестве аргумента. – domalb

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