Un puntatore funzione del tipo bool (*)()
può essere convertito std::function<bool()>
ma non è lo stesso tipo, quindi è necessaria una conversione. Prima che il compilatore possa verificare se è possibile effettuare tale conversione, è necessario dedurre , ma per farlo è necessario sapere già che std::function<bool()>
è una possibile conversione, che non è possibile finché non si deduce ReturnT
... vedere il problema?
Inoltre, si consideri che bool(*)()
potrebbe anche essere convertito in std::function<void()>
o std::function<int()>
... quale dovrebbe essere dedotto?
Considerate questa semplificazione:
template<typename T>
struct function
{
template<typename U>
function(U) { }
};
template<typename T>
void foo(function<T>)
{ }
int main()
{
foo(1);
}
Come può il compilatore sapere se si voleva creare function<int>
o function<char>
o function<void>
quando tutti possono essere costruiti sotto forma di un int
?
fonte
2012-06-19 15:03:34
Una risposta a [una delle mie precedenti domande] (http://stackoverflow.com/questions/9625526/check-at-compile-time-if-template-argument-is-void) consente questo tipo di sintassi. Spero che aiuti. È specializzato nel caso in cui anche il tipo di reso sia nullo. – chris
@chris Grazie per il suggerimento - proverò a capirlo :) –
N.B. molto simile a http://stackoverflow.com/q/7608741/981959 e http://stackoverflow.com/q/9242234/981959, ma penso che le risposte qui siano più chiare per questa specifica domanda. –