[英]How can I call variadic template constructor in c++?
我正在学习c ++模板技术。
我用以下可变参数模板增强构造了一个构造器。
该类非常简化,因此没有意义。 但是我无法调用该函数。 编译器告诉我它不能直接调用构造函数。
我怎么称呼它?
#include <utility>
class TemplateVariadicAugments {
public:
template <typename FutureInnterTemplateClass, typename... Args>
TemplateVariadicAugments(Args&&... args) : value_(std::forward<Args>(args)...) {}
virtual ~TemplateVariadicAugments() = default;
int value_;
};
void test_variadic_template_augments(void) {
TemplateVariadicAugments a = TemplateVariadicAugments::template TemplateVariadicAugments<int, int>(1);
}
在您编写的形式中,无法调用构造函数。 首先,在C ++中,即使在平凡的情况下,也无法按其名称调用构造函数:
class A
{
public:
A() {}
};
void foo()
{
A::A(); // Illegal.
}
然后,由于您无法直接调用构造函数,因此无法显式实例化模板,因此必须推导出所有模板参数。 但是在您的情况下,无法推导出FutureInnterTemplateClass
,因为在构造函数中的任何地方都没有使用它。
解决方案是从构造函数中删除冗余参数:
template <typename... Args>
TemplateVariadicAugments(Args&&... args) : value_(std::forward<Args>(args)...) {}
现在可以按以下方式构造对象:
TemplateVariadicAugments obj(1);
在这种情况下, Args
和Args
可以正确推导为int
。
但是在这种情况下,您不清楚要使用可变参数模板参数说什么,就像构造一个这样的对象一样:
TemplateVariadicAugments obj(1, 2);
您的value_
成员初始化将与此代码等效:
int value_(1, 2);
这显然是不正确的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.