Что является заменой для std :: function :: arguments_type? - PullRequest
0 голосов
/ 28 сентября 2018

Согласно cppreference.com все следующие три: argument_type, first_argument_type и second_argument_type устарели в C ++ 17 и удалены в C ++ 20.

Какая стандартная замена библиотеки для этих типов членов?Я имею в виду, что мог бы написать свои собственные черты типа, но сомневаюсь, что что-то удаляется без надлежащей замены в стандартной библиотеке.

Например:

template <typename F> 
void call_with_user_input(F f) {
    typename F::first_argument_type x;  // what to use instead ??
    std::cin >> x;
    f(x);
}

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Вы можете получить тип, введя параметры шаблона

template <typename Ret, typename Arg> 
void call_with_user_input(std::function<Ret(Arg)> f) {
    Arg x;
    std::cin >> x;
    f(x);
}

Предоставляет тип аргумента в качестве параметра шаблона.В качестве бонуса вы также получаете тип возврата, если он вам нужен.

0 голосов
/ 28 сентября 2018

Из моего понимания они будут удалены и все тут.Я нашел предложение здесь .

Относится к first_argument_type и second_argument_type:

Приспосабливаемые привязки функций были сильным кандидатом на удаление в C ++ 17, но были сохранены только потому, что не было адекватныхзамена для пользователей унарных / бинарных отрицателей для миграции.Эта функция, std :: not_fn, была добавлена ​​в C ++ 17 для разрешения пути миграции,

Проверка std :: not_fn для c ++ 17 я обнаружил, что:

Обратите внимание, что протокол адаптируемой функции больше не функционирует так же, как и при первоначальном проектировании, благодаря добавлению новых языковых функций и библиотек, таких как лямбда-выражения, "алмазные" функторы и многое другое,Это не из-за недостатка усилий, а просто из-за того, что невозможно иметь уникальный набор typedef для некоторых из этих типов, таких как полиморфные лямбда-объекты.Однако мы платим за сохранение поддержки в других местах библиотеки из-за неудобных условно определенных членов typedefs в нескольких компонентах, таких как std :: function, обертывающих тип функции ровно одним или двумя параметрами, или аналогичным образом для std ::reference_wrapper для ссылок на функции ровно одного или двух аргументов.

Это означает, что они будут просто удалены.

Кажется, одна из проблем с first_argument_type и second_argument_typeбыть из-за polymorphic lambda objects.

Также, как указано в комментариях, все с несколькими operator(), которые могут быть переданы в std::variant<...>::visit, имеют проблемыс first_argument_type

0 голосов
/ 28 сентября 2018

Одним из способов является использование boost::function_types:

#include <boost/function_types/parameter_types.hpp>
#include <boost/mpl/at.hpp>

template <typename F> 
void call_with_user_input(F f) {
    using FnType = decltype(&F::operator());
    using FirstArgType = typename boost::mpl::at_c<boost::function_types::parameter_types<FnType>, 0>::type;
    FirstArgType x;
    std::cin >> x;
    f(x);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...