Sé que esto no fue posible en C++ 03, pero espero que haya algún vudú nuevo que me permita hacer esto. Vea debajo:¿Hay alguna forma en C++ 11 para obtener el tipo de puntero de miembro dentro de una plantilla?
template <class T>
struct Binder
{
template<typename FT, FT T::*PtrTomember>
void AddMatch();
};
struct TestType
{
int i;
};
int main(int argc, char** argv)
{
Binder<TestType> b;
b.AddMatch<int,&TestType::i>(); //I have to do this now
b.AddMatch<&TestType::i>(); //I'd like to be able to do this (i.e. infer field type)
}
¿Hay alguna manera de hacer esto en C++ 11? ¿Ayudará decltype?
** ACTUALIZACIÓN: Usando el ejemplo de Vlad estaba pensando algo como esto iba a funcionar (advertencia: no he compilado como estoy construyendo el compilador con el apoyo decltype ahora)
template <class T>
struct Binder
{
template<typename MP, FT ft = decltype(MP)>
void AddMatch()
{
//static_assert to make sure MP is a member pointer of T
}
};
struct TestType
{
int i;
};
int main()
{
Binder<TestType> b;
b.AddMatch<&TestType::i>();
}
Que este trabajo?
Dado que lo está especificando, dudo que haya una manera. Debería funcionar incluso en C++ 03 si fuera 'AddMatch (& TestType :: i) 'en su lugar. –
¿Qué necesitas hacer con el puntero a miembro? Puede ser que haya una mejor solución que usar un puntero a miembro como un parámetro de plantilla sin tipo. – bames53