C ++ Variadic шаблон для оценки указателя на член - PullRequest
0 голосов
/ 09 марта 2019

Я хотел бы создать шаблон переменной, который оценивает вложенный указатель на элементы.Я пробовал следующее:

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?Обратите внимание, что мой компилятор не поддерживает параметры автоматического шаблона.

1 Ответ

1 голос
/ 09 марта 2019

Измените порядок методов и исправьте "опечатки":

template<typename T, typename U>
U getField(T &input, U (T::*field))
{
    return input.*field;
}

template<typename T, typename U, typename... V>
auto getField(T &input, U (T::*field), V... args)
    -> decltype(getField(input.*field, args...))
{
    return getField(input.*field, args...);
}

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...