C++ consente ai parametri del modello non di tipo di essere puntatore, inclusi il puntatore di funzione, il tipo. Recentemente ho chiesto a question informazioni su ciò per cui è utile, e questo è il seguito di one of the answers.C'è un modo per dedurre il valore di un parametro del modello di puntatore a funzione?
È possibile dedurre il valore di un parametro del modello di puntatore a funzione, da un argomento di funzione che è il puntatore di funzione in questione? Ad esempio:
using VoidFunction = void(*)();
template <VoidFunction F>
void templ(VoidFunction);
...
void func(); // a VoidFunction
...
templ<func>(func); // works, but I have to specify the template parameter explicitly
templ(func); // <-- I would like to be able to do this
C'è un modo per ottenere questa deduzione? Sembra tecnicamente possibile dal punto di vista di un implementatore del compilatore, purché l'argomento della funzione possa essere risolto con una funzione nel codice in fase di compilazione.
Se vi state chiedendo le motivazioni alla base di questo, vedere i commenti sotto this answer, in particolare una possibile ottimizzazione per l'implementazione di std::bind()
.
EDIT: Mi rendo conto che ho potuto semplicemente rimuovere l'argomento della funzione e utilizzare l'argomento modello, come in templ<func>()
. Il mio unico scopo di aggiungere l'argomento della funzione era di cercare di evitare di dover passare l'argomento del template.
Credo che quello che voglio veramente, è di dedurre anche la tipo del puntatore a funzione, come in:
template <typename Function, Function F>
void templ(/* something */);
e quindi essere in grado di chiamare
templ(func);
o
templ<func>();
e avere sia il tipo che il valore da dedurre da un singl e menzione del puntatore della funzione.
Speranza che ha più senso ora.
Come poteva dedurlo? Per esempio, potrei fare questo: 'template void foo (std :: size_t i) {int arr [N];/* fill */return arr [i];} '. Vorrei assolutamente un errore se mi capitasse di dimenticare l'argomento del modello quando questa deduzione poteva essere fatta. –
chris
Vieni a pensarci, non sono sicuro di capire perché debba essere passato anche come argomento di funzione. 'Templ();' sufficiente? –
chris
@chris: Giusto, la mia domanda non ha molto senso come scritto :) Vedi la mia modifica. – HighCommander4