2013-08-05 34 views
6

Mi chiedo se sia possibile verificare se un puntatore a una funzione assegnato a std::function è un nullptr. Mi aspettavo che il ! -operator lo facesse, ma sembra funzionare solo quando alla funzione è stato assegnato qualcosa di tipo nullptr_t.Verifica se una funzione std :: è assegnata a un nullptr

typedef int (* initModuleProc)(int); 

initModuleProc pProc = nullptr; 
std::function<int (int)> m_pInit; 

m_pInit = pProc; 
std::cout << !pProc << std::endl; // True 
std::cout << !m_pInit << std::endl; // False, even though it's clearly assigned a nullptr 
m_pInit = nullptr; 
std::cout << !m_pInit << std::endl; // True 

Ho scritto questa funzione di supporto per aggirare questo per ora.

template<typename T> 
void AssignToFunction(std::function<T> &func, T* value) 
{ 
    if (value == nullptr) 
    { 
     func = nullptr; 
    } 
    else 
    { 
     func = value; 
    } 
} 
+0

Significa "assegnato qualcosa di tipo' nullptr_t' ", giusto? Quando ho letto le risposte per la prima volta, ho pensato che stavi facendo una distinzione tra inizializzazione e assegnazione, ma ora vedo il contrario. –

+2

Si prega di evitare crap non-portatile come '__cdecl' e' HWND' negli esempi, la tua domanda non si basa su nulla di specifico di Windows, quindi non c'è motivo di non usare un tipo di funzione come 'void()' che può essere testato da chiunque su qualsiasi piattaforma. –

+0

Ho rimosso le parti specifiche di Windows e le ho modificate in "tipo nullptr_t" –

risposta

8

Questo è un bug nel std::function implementazione (e anche apparentemente in miniera), la norma dice che operator! tornerà true se l'oggetto è costruito con un puntatore a funzione nullo, vedi paragrafo [func.wrap.func] 8. L'operatore di assegnazione dovrebbe essere equivalente alla costruzione di un std::function con l'argomento e lo scambio, quindi operator! dovrebbe restituire true in tal caso.

+0

Non è un 'esplicito operatore bool()'? – dyp

+1

@DyP: E '!' Provoca la conversione contestuale in bool, che richiama l'operatore esplicito. –

+0

@DyP, mi riferivo all'operatore globale! 'Che è usato nel testcase, non' std :: function :: operator! '(Che non esiste.) –