Я знаю, что это невозможно в C++ 03, но я надеюсь, что есть несколько новых вуду, которые позволят мне это сделать. См. Ниже:Есть ли в C++ 11, чтобы получить тип указателя члена в шаблоне?
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)
}
Есть ли способ сделать это в C++ 11? Помогло ли decltype?
** UPDATE: Используя пример Влада я думал что-то вроде этого будет работать (предостережение: я не скомпилированы как я строю компилятор с поддержкой decltype сейчас)
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>();
}
Будет ли это работать?
Учитывая, что вы явно указываете это, я сомневаюсь, что есть способ. Он должен работать даже в C++ 03, если вместо этого был «AddMatch (& TestType :: i)». –
Что вам нужно сделать с указателем на член? Может быть, есть лучшее решение, чем использование указателя-к-члену в качестве параметра шаблона непигового типа. – bames53