C++ 如何简化接受泛型方法指针C++;14
我正在为Actor系统设计一个消息队列,其中消息队列包含std::function对象。将消息添加到队列的客户端代码具有复杂的语法,我想对其进行简化。一些示例代码: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 &
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);