【问题标题】:Is a parameter pack a template parameter?参数包是模板参数吗?
【发布时间】:2019-10-08 13:46:11
【问题描述】:

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

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

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

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

【问题讨论】:

  • 想一想...使用您展示的代码,您可以执行MyClass&lt;int, double, MyOtherStructure&gt; my_object;。这意味着你有std::unique_ptr&lt;int, double, MyOtherStructure&gt; m_data;。这是无效的。
  • 你把...放错地方了:必须是template&lt;typename... T&gt;

标签: c++ templates variadic-templates terminology


【解决方案1】:

是的,参数包是一个有效的模板参数,可以在声明中使用。但是当模板被实例化时,它会被替换为实际提供的模板列表参数,参见https://en.cppreference.com/w/cpp/language/template_parameters

例如在您的示例中,MyClass&lt;int&gt; 将包含std::unique_ptr&lt;int&gt;MyClass&lt;int, MyDeleter&gt; 将包含std::unique_ptr&lt;int, MyDeleter&gt;MyClass&lt;int, MyDeleter, Foo&gt; 将导致编译器错误“模板参数数量错误”,因为std::unique_ptr 最多可能有两个。

【讨论】:

    【解决方案2】:

    当然,你可以把它想象成你在实例化MyClass时写下了一个类型序列(应该是template&lt;typename... T&gt; 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;
    }
    

    【讨论】:

      【解决方案3】:

      除了其他的答案,我想从标准的角度补充这个问题的答案。

      [temp.variadic]/1:

      模板参数包是一个模板参数,它接受零或 更多模板参数。

      是的,模板参数包是模板参数。你贴的代码sn-p是正确的。

      【讨论】:

        猜你喜欢
        • 2021-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-15
        • 2020-04-29
        • 1970-01-01
        相关资源
        最近更新 更多