Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何简化接受泛型方法指针C++;14_C++ - Fatal编程技术网

C++ 如何简化接受泛型方法指针C++;14

C++ 如何简化接受泛型方法指针C++;14,c++,C++,我正在为Actor系统设计一个消息队列,其中消息队列包含std::function对象。将消息添加到队列的客户端代码具有复杂的语法,我想对其进行简化。一些示例代码: class Actor { std::deque<std::function<void()>> fMessageQueue; template <class F, class ... Args> void AddMessage(F &&fn, Args &

我正在为Actor系统设计一个消息队列,其中消息队列包含std::function对象。将消息添加到队列的客户端代码具有复杂的语法,我想对其进行简化。一些示例代码:

class Actor
{
    std::deque<std::function<void()>> fMessageQueue;

    template <class F, class ... Args>
    void AddMessage(F &&fn, Args && ... args)
    {
        fMessageQueue.push_back(std::bind(std::forward<F>(fn), std::forward<Args>(args)...));
    }
}

class MyActor : public Actor
{
    void Behaviour1(float arg) {/*do something*/}
}
理想情况下,我希望使用以下代码语法:

int main(int argc, const char **argv)
{
    MyActor a;
    a.AddMessage(&MyActor::Behaviour1, 1.0f);  // notice no 2nd argument &a
}
我希望客户端API不需要'a'的第二个实例(用作std::bind()的第二个参数)

在搜索网络时,我设法找到了一些接近我想要实现的东西,但参数语法相反:

template <class M> struct Behaviour;
template <class C, class ... Args> struct Behaviour<void(C::*)(Args ...)>
{
    using M = void (C::*)(Args ...);
    template <M mp> static void Call(C *target, Args && ... args)
    {
        target->fMessageQueue.push_back(std::bind(mp, target, args ...));
    }
};
#define MSG(m) Behaviour<decltype(m)>::Call<m>
这稍微清晰一些,但仍然不太像我理想的调用语法。我也不喜欢宏味精。最简单的API调用语法是:

int main(int argc, char **argv)
{
    MyActor a;
    Actor::MSG(&MyActor::Behaviour1)(&a, 1.0f);
}
a.AddMessage(&MyActor::Behaviour1, 1.0f);

有人知道我如何简化调用语法以便客户端不必指定参数#2吗

为什么不能在
AddMessage
中执行
绑定(fn,this,args…
?(简化)这是我尝试的第一件事。编译器错误为“未能专门化函数模板”未知类型std::invoke(_可调用&&,_类型&&&…)“该错误很可能是由于泛型“this”指针的类型推断规则造成的,我无法解决该问题。”这适用于固定方法指针,但不适用于通用方法指针。我不知道将“this”强制转换为所需类型的模板魔法(因此我的问题是堆栈溢出)。为什么不能在
AddMessage
中执行
bind(fn,this,args…)?(简化)这是我尝试的第一件事。编译器错误为“未能专门化函数模板”未知类型std::invoke(_可调用&&,_类型&&&…)“该错误很可能是由于泛型“this”指针的类型推断规则造成的,我无法解决该问题。”这适用于固定方法指针,但不适用于通用方法指针。我不知道将“this”强制转换为所需类型的模板魔法(因此我的问题是堆栈溢出)。
a.AddMessage(&MyActor::Behaviour1, 1.0f);