Ho utilizzato (e visto usato) static_assert
per segnalare valori non desiderati dei valori dei parametri del modello. Tuttavia, per tutti i casi in cui mi sono imbattuto sembra meglio e più elegante disabilitare quei valori indesiderati tramite SFINAE. Per esempioQuando utilizzare `static_assert` invece di SFINAE?
template<typename T,
class = std::enable_if<std::is_floating_point<T>::value>::type>
struct Foo { ... };
invece di
template<typename T>
struct Foo {
static_assert(std::is_floating_point<T>::value,
"Foo<T>: T must be floating point :-(");
...
};
Quindi la mia domanda: quando usare static_assert
invece di SFINAE e perché?
EDIT
Penso che quello che ho imparato finora è il seguente
SFINAE è uno strumento versatile e potente, ma potenzialmente molto complicato che può essere utilizzato per molte attività, tra cui funzione di risoluzione di sovraccarico (che alcuni sembrano considerare come il suo unico scopo).
SFINAE può essere utilizzato in modo relativamente semplice in cui mai static_assert
può, tranne che appare nel dichiarazione (di una classe o funzione) piuttosto che la sua definizione (o è possibile inserire a static_assert
in una dichiarazione di inoltro di classe?). Questo rende il codice più verbale e quindi più chiaro. Tuttavia, poiché SFINAE è complicato, tende ad essere più difficile da ottenere rispetto ad un semplice static_assert
.
D'altra parte static_assert
ha il vantaggio di un messaggio di errore del compilatore più chiaro, che alcuni sembrano considerare come lo scopo principale di entrambi.
Puoi spiegare perché pensi che sia meglio con SFINAE? –
Forse le nostre risposte sono orientate dal vocabolario. Nella tua domanda penso che dovresti sostituire SFINAE con 'std :: enable_if'. Sembra strano voler generare un errore con un meccanismo che enfatizza il fatto che non si tratta di un errore. SFINAE = Errore di sostituzione non è un errore – log0