Как заменить std :: binary_function чем-то другим без боли? - PullRequest
2 голосов
/ 06 мая 2019

В настоящее время мы используем некоторые сторонние пакеты, которые используют некоторые std :: binary_function, std :: unary_function глубоко внутри. Как вы, возможно, знаете, эти функции устарели в C ++ 14, а теперь все они были удалены из C ++ 17. Мы собираемся использовать некоторые новые функции C ++ 17, и в то же время мы не собираемся вносить некоторые существенные изменения, поскольку это может привести к некоторой нестабильности в наших кодах. Как просто заменить эти устаревшие функции C ++ (std :: binary_function, ...) чем-то другим с меньшей болью.

Заранее благодарю за помощь.

1 Ответ

2 голосов
/ 06 мая 2019

Я не знаю ни одного существующего типа в стандартной библиотеке, но не сложно создать свой собственный:

template<class Arg1, class Arg2, class Result> 
struct binary_function
{
    using first_argument_type = Arg1;
    using second_argument_type = Arg2;
    using result_type = Result;
};

template <typename ArgumentType, typename ResultType>
struct unary_function
{
    using argument_type = ArgumentType;
    using result_type = ResultType;
};

Оба эти класса являются простыми базовыми классами для пользовательских функциональных объектов, например ::100100

struct MyFuncObj : std::unary_function<int, bool>
{
    bool operator()(int arg) { ... }
};

Наличие псевдонимов для аргументов позволяет использовать некоторую стандартную библиотеку, встроенную в функциональность, например, std::not1: std::not1(MyFuncObj()).

Я предполагаю, что это устарело, потому что после C ++ 11 в основном лямбды используются для создания функциональных объектов. А с помощью шаблонов с вариационными формами довольно просто создать универсальную версию not и других вещей, не имея std::not1, std::not2.

...