Considerare il seguente codice di meta-programmazione modello semplificato che implementa una classe Angle
che memorizza internamente il modulo a 360 gradi di valore ridotto.Initalization costante in classe Auto + statico con meta-programmazione
#include <iostream>
#include <typeinfo>
template<int N, int D>
struct Modulus
{
static auto const value = N % D;
};
template<int N>
struct Angle
{
static auto const value = Modulus<N, 360>::value; // ERROR
//static int const value = Modulus<N, 360>::value; // OK
//static auto const value = N % 360; // OK
typedef Angle<value> type;
};
int main()
{
std::cout << typeid(Angle<30>::type).name() << "\n";
std::cout << typeid(Angle<390>::type).name() << "\n";
return 0;
}
Uscita su Ideone
Con Visual C++ 2010 Express, che posso fare static auto const = Modulus<N, 360>::value
, ma con MinGW gcc 4.7.2 (Nuwen distro) o Ideone (gcc 4.5.1) devo né indicare esplicitamente la digitare come static int const value = Modulus<N, 360>::value
o devo utilizzare auto
con l'espressione modulare completa come static auto const value = N % 360;
.
Domanda: quale compilatore è corretto in base al nuovo standard C++ 11?
Sì, in gcc 4.5.1 il supporto per C++ 11 è ancora molto incompleto, è necessario controllare http://gcc.gnu.org/projects/cxx0x.html per vedere quali funzionalità sono disponibili in quale versione. –
@hvd, errato. quelli devono essere dichiarati constexpr. –
@SegFault Ricevo anche questi errori con MinGW 4.7 – TemplateRex