Ponteiro para membro: funciona no GCC, mas não no VS2015
Estou tentando implementar um sistema de "propriedade" para converter instâncias C ++ em JSON e vice-versa. Peguei parte do código da resposta de Guillaume Racicot nesta pergunta (Serialização C ++ JSON) e simplificou.
Aqui está como eu procedo. eu tenho umProperty
classe:
template <typename Class, typename T>
struct Property {
constexpr Property(T Class::* member, const char* name) : m_member(member), m_name(name) {}
T Class::* m_member;
const char* m_name;
};
m_member aponta para um membro específico deClass
Digamos que eu queira definir propriedades para umUser
classe, eu gostaria de poder continuar assim, para poder atribuir aos membros um nome de propriedade:
class User
{
public:
int age;
constexpr static auto properties = std::make_tuple(
Property<User, int>(&User::age, "age")
);
}
Esse código compila e funciona corretamente no GCC (http://coliru.stacked-crooked.com/a/276ac099068579fd), mas não no Visual Studio 2015 Update 3. Eu recebo esses erros:
main.cpp(19) : error C2327 : 'User::age' : is not a type name, static, or enumerator
main.cpp(19) : error C2065 : 'age' : undeclared identifier
main.cpp(20) : error C2672 : 'std::make_tuple' : no matching overloaded function found
main.cpp(20) : error C2119 : 'properties' : the type for 'auto' cannot be deduced from an empty initializer
Haveria uma solução alternativa para fazê-lo funcionar no Visual Studio 2015 Update 3?