【发布时间】:2021-02-17 21:37:52
【问题描述】:
可变参数类模板参数推导与可变参数函数模板参数推导有何不同?我目前有一个事件对象,它创建一个作为某个基类的子类的对象,并且每个子类的构造函数都采用不重叠的类型和参数数量。我必须完成的课程看起来像这样
template <class T, class... Args>
struct CreateDrawableObjTreeEvent : RenderEvent {
CreateDrawableObjTreeEvent(Args&&... args) {
drawable = new T(std::forward<Args>(args)...);
}
T* drawable;
};
我想要实例化它的方式看起来像这样
RenderEvent* test = new CreateDrawableObjTreeEvent<DrawableObject>("testvertices");
其中 DrawableObject 构造函数采用 1 个字符串。当我尝试运行它时,我遇到了这个错误
'CreateDrawableObjTreeEvent<DrawableObject>::CreateDrawableObjTreeEvent': no overloaded function takes 1 argument
但是,当我修改类结构以便实例化发生在函数中而不是构造函数中时,它编译时不会出现问题
template <class T>
struct CreateDrawableObjTreeEvent : RenderEvent {
CreateDrawableObjTreeEvent() {}
template <class... Args>
void instantiate(Args&&... args) {
drawable = new T(std::forward<Args>(args)...);
}
T* drawable;
};
...
CreateDrawableObjTreeEvent<DrawableObject>* test = new CreateDrawableObjTreeEvent<DrawableObject>();
test->instantiate("testvertices");
我真的很想能够使用第一种方法的语法,有什么方法可以干净地实现这种行为吗?
【问题讨论】:
-
Args&... args中的单个 & 符号&是错字吗?为了完美转发,通常写Args&&... args以便参考折叠规则根据需要生效。
标签: c++ templates variadic-templates variadic template-argument-deduction