C++ 在c++;11、如何调用任意可调用对象?

C++ 在c++;11、如何调用任意可调用对象?,c++,callable,C++,Callable,中定义了可调用的概念 假设我有一个可调用对象f,它有一个类型为T*的参数,返回类型为voidf可以是任何可调用类型(函数对象、成员函数指针、数据成员指针等)。如何调用f 简单调用f(x)失败,因为f可以是指向成员函数或数据成员的指针。有没有一种简单的方法来调用f?一种可能的解决方案是std::bind(f,x)(),但当f有更多参数时,此解决方案会变得更复杂。这正是std::invoke所做的,但直到C++17才成为标准。您可以制作自己的版本,但如果它是完全通用的,则可能会非常复杂 以下是两个案

中定义了可调用的概念

假设我有一个可调用对象f,它有一个类型为T*的参数,返回类型为voidf可以是任何可调用类型(函数对象、成员函数指针、数据成员指针等)。如何调用f


简单调用f(x)失败,因为f可以是指向成员函数或数据成员的指针。有没有一种简单的方法来调用f?一种可能的解决方案是std::bind(f,x)(),但当f有更多参数时,此解决方案会变得更复杂。

这正是
std::invoke
所做的,但直到C++17才成为标准。您可以制作自己的版本,但如果它是完全通用的,则可能会非常复杂

以下是两个案例的基本想法(代码取自cppreference.com):

模板
内联自动调用(F&&F,Args&&…Args)->
decltype(std::forward(f)(std::forward(args)…){
返回std::forward(f)(std::forward(args)…);
}
模板
内联自动调用(T基::*pmd,派生和引用)->
decltype(标准::转发(ref)。*pmd){
返回标准::转发(ref)。*pmd;
}

与其自己实现
调用
,不如使用以下方法之一。特别是,我的工作。因此,您可以使用
std::ref(f)(args…)实现
std::invoke(f,args…)

invoke(F{})
将打印
Lvalue
,而C++17中的
std::invoke(F{})
将打印
Rvalue

我从

使用中发现了这项技术:

#包括
// ...
boost::hof::apply(f,args…);
boost::hof::apply执行与之相同的操作



或者,使用,它做同样的事情

你有用例吗?它是在gcc 5.2中实现的吗?我想我可以复制中提供的可能实现。谢谢。为了记录在案,MSVC2015显然已经全面实施。
template <class F, class... Args>
inline auto INVOKE(F&& f, Args&&... args) ->
    decltype(std::forward<F>(f)(std::forward<Args>(args)...)) {
      return std::forward<F>(f)(std::forward<Args>(args)...);
}

template <class Base, class T, class Derived>
inline auto INVOKE(T Base::*pmd, Derived&& ref) ->
    decltype(std::forward<Derived>(ref).*pmd) {
      return std::forward<Derived>(ref).*pmd;
}
template<typename F, typename... Args>
auto invoke(F f, Args&&... args)
    -> decltype(std::ref(f)(std::forward<Args>(args)...))
{
    return std::ref(f)(std::forward<Args>(args)...);
}
struct F
{
    void operator()() && {
        std::cout << "Rvalue\n";
    }
    void operator()() const& {
        std::cout << "Lvalue\n";
    }
};
#include <boost/hof/apply.hpp>

// ...
boost::hof::apply(f, args...);