Что такое 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.