Я хотел бы создать шаблон переменной, который оценивает вложенный указатель на элементы.Я пробовал следующее:
template<typename T, typename U, typename... V>
auto getField(T &input, U (T::*field), V... args)
-> decltype(getField(input.*field, &args...))
{
getField(input.*field, &args...);
}
template<typename T, typename U>
U getField(T &input, U (T::*field))
{
return input.*field;
}
struct inner {
int val;
};
struct outer {
inner in;
};
void main() {
outer p{{5}};
cout << getField(p, &outer::in, &inner::val) << endl;
}
Когда я компилирую вышеупомянутое в VS, я получаю следующие сообщения об ошибках:
ошибка C2672: 'getField': нет соответствующей перегруженной функциинайденныйошибка C2893: не удалось специализировать шаблон функции 'getField неизвестного типа (T &, UT :: *, V ...)'примечание: со следующими аргументами шаблона:примечание: «T = внешний»примечание: «U = внешний :: внутренний»примечание: 'V = {int outer :: inner :: *}'
Как исправить вышеприведенный шаблон переменной для компиляции и вернуть p.in.val
?Обратите внимание, что мой компилятор не поддерживает параметры автоматического шаблона.