Я не знаю ни одного существующего типа в стандартной библиотеке, но не сложно создать свой собственный:
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
.