Sto lavorando all'aggiornamento di alcuni codici C++ per sfruttare la nuova funzionalità in C++ 11. Ho una classe dei caratteri con alcune funzioni che restituiscono tipi fondamentali che, nella maggior parte dei casi, potrebbero restituire un'espressione costante, ma non sempre. Mi piacerebbe fare cose diverse a seconda che la funzione sia constexpr
o meno. Sono venuto con il seguente approccio:Rilevazione di constexpr con SFINAE
template<typename Trait>
struct test
{
template<int Value = Trait::f()>
static std::true_type do_call(int){ return std::true_type(); }
static std::false_type do_call(...){ return std::false_type(); }
static bool call(){ return do_call(0); }
};
struct trait
{
static int f(){ return 15; }
};
struct ctrait
{
static constexpr int f(){ return 20; }
};
int main()
{
std::cout << "regular: " << test<trait>::call() << std::endl;
std::cout << "constexpr: " << test<ctrait>::call() << std::endl;
}
Il parametro aggiuntivo int
/...
è là in modo che, se entrambe le funzioni sono disponibili dopo SFINAE, il primo viene scelto da sovraccarico risoluzione.
compilazione e l'esecuzione di questo con clangore 3,2 spettacoli:
regular: 0
constexpr: 1
Quindi questo sembra funzionare, ma mi piacerebbe sapere se il codice è legale C++ 11. Specialmente poiché è a mia conoscenza che le regole per SFINAE sono state modificate.
problema interessante. Ho scritto una risposta che pensavo provasse che fosse legale, ma poi ho scritto una [versione modificata] (http://liveworkspace.org/code/SWmBI$5) che avrebbe dovuto essere ugualmente valida secondo la mia risposta, e quella non si compila su nessun compilatore. Quindi non ho intenzione di presentare la risposta, ma sono molto curioso. –
Correlati: [È is_constexpr possibile in C++ 11?] (Http://stackoverflow.com/questions/13299394/is-is-constexpr-possible-in-c11). Inoltre, consultare [Chiamare constexpr nell'argomento modello predefinito] (http://stackoverflow.com/questions/10721130/calling-constexpr-in-default-template-argument). –
@AndyProwl: Sono curioso, potresti pubblicare la tua soluzione su liveworkspace.org o su un altro sito simile? –