如何在c ++中调用variadic模板构造函数?

时间:2017-01-19 03:50:22

标签: c++ templates

我正在学习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);

}

1 个答案:

答案 0 :(得分:2)

在您编写的表单中,无法调用构造函数。首先,在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会被正确推断为int

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

TemplateVariadicAugments obj(1, 2);

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

int value_(1, 2);

显然是不合格的。