Что такое std:: invoke в c++? [закрытый]
Я только что читал о std::thread
и std::bind
который я столкнулся с Callable
концепция и std::invoke
.
Я читал про std::invoke
on cppreference
Что такое std::invoke
, std::function
, std::bind
и Callable
концепции? И какие отношения между ними?
2 ответов
std::invoke
принимает что-то вызываемое и аргументы, чтобы вызвать его, и делает вызов. std::invoke( f, args... )
является небольшим обобщением ввода f(args...)
, которое также обрабатывает несколько дополнительных дел.
что-то вызываемое включает указатель функции или ссылку, указатель функции-члена, объект с operator()
, или указатель на элемент данных.
в случаях членов первый аргумент интерпретируется как this
. Затем остальные аргументы передаются в ()
(за исключением случая указателя на данные-члена).
INVOKE был концепцией в стандарте C++; C++17 просто выставил std::invoke
Что делает это напрямую. Я подозреваю, что он был разоблачен отчасти потому, что он полезен при выполнении другого метапрограммирования, отчасти потому, что каждая стандартная библиотека уже имеет реализацию INVOKE в ней и разоблачение было в основном бесплатным, а отчасти потому, что это облегчает разговор о INVOKE, когда это конкретная вещь.
A Callable
объект, помимо специфичных для C++деталей, "то, что можно назвать". Это не обязательно должна быть функция: C++ имеет ряд типов, которые могут быть вызваны, и проходить через них каждый раз, когда любой может появиться (читай: общий код), проблематично и слишком повторяется.
что это std::invoke
is for-он позволяет вызывать общий объект (который, согласно C++17, удовлетворяет Callable
concept) вызывается без особых усилий.
давайте рассмотрим простой пример:
void foo() { std::cout << "hello world\n"; };
template <bool b>
struct optionally_callable
{
std::enable_if_t<b> operator() () { std::cout << "hi again\n"; }
};
int main()
{
auto c = [] { std::cout << "hi from lambda\n" ;};
std::invoke(foo);
std::invoke(c);
auto o = optionally_callable<true>{};
//auto o2 = optionally_callable<false>{};
std::invoke(o);
}
o2
is не отзывной, то есть std::is_invocable<decltype(o2)>::value
is false
.