Wiem, że nie było to możliwe w C++ 03, ale mam nadzieję, że pojawi się jakiś nowy voodoo, który pozwoli mi to zrobić. Zobacz poniżej:Czy jest jeszcze w C++ 11, aby uzyskać typ wskaźnika członka w szablonie?
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)
}
Czy jest jakiś sposób, aby to zrobić w C++ 11? Czy pomoże Ci typ decltype?
** UPDATE: Korzystanie przykład Vlada Myślałam coś jak to będzie działać (uwaga: nie mam skompilowane jako buduję kompilator z decltype wsparciu teraz)
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>();
}
to będzie działać?
Biorąc pod uwagę, że wyraźnie określasz to, wątpię, czy jest jakiś sposób. Powinien działać nawet w C++ 03, jeśli zamiast tego był "AddMatch (& TestType :: i)". –
Co należy zrobić ze wskaźnikiem na członka? Możliwe, że istnieje lepsze rozwiązanie niż użycie wskaźnika do elementu jako nieopisanego parametru szablonu. – bames53