可变参数模板的扩展参数列表
我正在为一个研究项目开发基于事件的架构。该系统当前使用 Qt 信号,但我们正在尝试摆脱 Qt,因此我需要一些几乎与 Qt 事件循环和跨线程信号一样工作的东西。
可能与我更好的判断相反,我选择使用可变参数模板来创建一个通用事件,该事件将用于在目标线程中执行回调。
template<typename dest, typename... args>
class Event {
public:
Event(dest* d, void(dest::*func)(args...), args... a)
: d(d), func(func), pass(a...) { }
virtual void perform() {
(d->*func)(pass...);
}
protected:
dest* d;
void(dest::*func)(args...);
args... pass;
};
我还没有找到任何表明这是否可能的信息。然而,我很难相信事实并非如此。鉴于此,我想知道是否有办法做这样的事情,如果没有,为什么?另外,如果有人有更好的方法来做到这一点,我会欢迎这个建议。
I'm working on an Event based architecture for a research project. The system currently uses Qt signalling, but we are trying to move away from Qt, so I need something that will work almost as well as the Qt event loop and signals across threads.
Probably against my better judgement, I've chosen to use variadic templates to create a generic event that will be used to perform the callback in the destination thread.
template<typename dest, typename... args>
class Event {
public:
Event(dest* d, void(dest::*func)(args...), args... a)
: d(d), func(func), pass(a...) { }
virtual void perform() {
(d->*func)(pass...);
}
protected:
dest* d;
void(dest::*func)(args...);
args... pass;
};
I haven't found anything that indicates if this is possible. However, I have a hard time believing that it isn't. Given that, I was wondering if there is a way to do something like this and if there isn't, why? Also, if anybody has a better way of doing this I would welcome the suggestion.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
嗯。我想我遇到了一些令人讨厌的事情。代码不是很漂亮或很好,但你可能明白了。您应该能够使用模板递归地存储任何类型的对象,并且在调用函数时也可以递归地访问它们。
另外,我认为 std::bind 做了类似的事情,但不确定:D
Hm. I think I got something nasty. The code is not very pretty or good, but you probably get the idea. You should be able to use templates to recursively store objects of any type, and also recurse through them when calling the function.
Also, I think std::bind does something similar, but not sure :D
使用 boost::fusion::make_fused。看例子(对不起,日语......):
http://d.hatena.ne.jp/faith_and_brave/20100804/1280905506
use boost::fusion::make_fused. see example(sorry, japanese...):
http://d.hatena.ne.jp/faith_and_brave/20100804/1280905506