Итак, у меня есть масса функций, похожих на эти:
template <typename T>
bool Zero(const T, const T, const T);
template <typename T>
T One(const T, const T, const T, bool);
template <typename T>
T Three(const T, const T, const T, const T, const T, const T);
Для каждой из этих функций у меня есть оболочка, которая использует возвращаемый тип этих функций, поэтому он выглядит примерно так:
template <typename T>
decltype(Zero<decltype(declval<T>().x)>(decltype(declval<decltype(declval<T>().x)>()), decltype(declval<decltype(declval<T>().x)>()), decltype(declval<decltype(declval<T>().x)>()))) ZeroWrapper(const T);
template <typename T>
decltype(One<decltype(declval<T>().x)>(decltype(declval<decltype(declval<T>().x)>()), decltype(declval<decltype(declval<T>().x)>()), decltype(declval<decltype(declval<T>().x)>()), bool())) OneWrapper(const T);
template <typename T>
decltype(Three<decltype(declval<T>().x)>(decltype(declval<decltype(declval<T>().x)>()), decltype(declval<decltype(declval<T>().x)>()), decltype(declval<decltype(declval<T>().x)>()), decltype(declval<decltype(declval<T>().x)>()), decltype(declval<decltype(declval<T>().x)>()), decltype(declval<decltype(declval<T>().x)>()))) ThreeWrapper(const T);
Как видите, читать все эти decltype(declval<T>().x)
ужасно трудно. Могу ли я создать шаблон using
или есть какая-то стандартная функция, которая позволит мне извлечь тип возвращаемого значения из указателя функции без передачи типов аргументов в decltype
или result_of
? Так что-то вроде этого:
template <typename T>
foo_t<Zero<decltype(declval<T>().x)>> ZeroWrapper(const T);
template <typename T>
foo_t<One<decltype(declval<T>().x)>> OneWrapper(const T);
template <typename T>
foo_t<Three<decltype(declval<T>().x)>> ThreeWrapper(const T);
decltype(declval<decltype(declval<T>().x)>())
похоже на тупик. Почему бы просто не ввести псевдоним it для чего-нибудь и уменьшить шаблон? - person Dan M.   schedule 04.03.2019.x
в оболочке в примере вопроса. - person Dan M.   schedule 04.03.2019auto
? Или конечный тип возвратаauto ZeroWrapper(const T arg) -> decltype(Zero(arg.x));
? - person Dan M.   schedule 04.03.2019Zero<decltype(declval<T>().x)>
- Ожидаете ли вы, чтоT
будет ссылочным типом (возможно, только если явно указано)? И намерены поддержать дело? Если нет, тоdeclval<T>().x
здесь можно заменить на более читаемыйT::x
- person StoryTeller - Unslander Monica   schedule 04.03.2019auto
в качестве возвращаемого типа, и если ваша функция достаточно проста, она будет работать. - person Dan M.   schedule 04.03.2019enable_if
. - person Jonathan Mee   schedule 04.03.2019