参数包是模板参数吗?

时间:2019-05-22 06:29:06

标签: c++ templates variadic-templates terminology

cppreference写道模板参数包是模板参数:

https://en.cppreference.com/w/cpp/language/parameter_pack

是真的吗?例如,编写这样的代码是否正确:

template<typename... Ts>
class MyClass {
    std::unique_ptr<Ts...> m_data;
};

3 个答案:

答案 0 :(得分:1)

是的,参数包是有效的模板 parameter ,用于声明。但是,当实例化模板 时,它会替换为实际提供的模板 arguments 的列表,请参见https://en.cppreference.com/w/cpp/language/template_parameters

例如在您的示例中,MyClass<int>将包含std::unique_ptr<int>MyClass<int, MyDeleter>将包含std::unique_ptr<int, MyDeleter>,而MyClass<int, MyDeleter, Foo>会导致编译器错误“模板参数数量错误”,因为{{ 1}}最多可以有两个。

答案 1 :(得分:0)

当然,可以想像一下,就好像在实例化MyClass时写下了一系列类型(应为template<typename... T> class MyClass; btw),然后将该序列准确地复制到std::unique_ptr的实例化。 std::unique_ptr最多接受两个参数,第二个参数很特殊,因此并非所有参数都能正常工作

int main() {
        MyClass<int> this_compiles;
        MyClass<int, std::default_delete<int>> as_does_this;
        //MyClass<int, double, char> this_does_not;
        //MyClass<> this_neither;
}

答案 2 :(得分:0)

除了其他答案,我还要从标准的角度为这个问题添加答案。

[temp.variadic]/1

  

模板参数包是接受零或   更多模板参数。

是的,模板参数包是模板参数。您发布的代码段正确。