繁体   English   中英

如何在C ++中调用可变参数模板构造函数?

[英]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);

在这种情况下, ArgsArgs可以正确推导为int

但是在这种情况下,您不清楚要使用可变参数模板参数说什么,就像构造一个这样的对象一样:

TemplateVariadicAugments obj(1, 2);

您的value_成员初始化将与此代码等效:

int value_(1, 2);

这显然是不正确的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM