【问题标题】:C++17 How is the vector class deducing the type from parameter pack?C++17 向量类如何从参数包中推导出类型?
【发布时间】:2020-12-04 08:18:46
【问题描述】:

我想从传递给构造函数的参数包中推断类类型(假设参数包中的所有值都是相同的类型),可以吗?

template<class T>
class SomeClass {
public:
   template<typename... Args>
   SomeClass(Args... args)
   {}

    std::vector<T> value;
}

int main() {
    SomeClass someClass(10, 40, 50, 60) // T would be int
}

如何从 Args 推导出 T???

【问题讨论】:

    标签: c++ templates types constructor variadic


    【解决方案1】:

    您可以提供自定义演绎指南 (C++17),例如:

    template <typename... Ts>
    SomeClass(Ts...) -> SomeClass<std::common_type_t<Ts...>>;
    

    Demo

    【讨论】:

      【解决方案2】:

      在你所拥有的情况下,你不能,因为向量是一个成员,成员只能基于封闭类型的参数。

      但是,您可以使向量成为其他类型的成员(包括 SomeClass 包含的类型),然后使用类型擦除做一些非常丑陋的工作(仅用于说明,我没有尝试将其添加到您拥有的内容中并得到它编译)。请注意,以下所有代码都将进入 SomeClass:

      struct base
      {
      

      虚拟 ~base() {} 虚拟类型 & get_item(size_t index) = 0; }; 模板 结构 impl : 基础 { std::vector 值。

        Type & get_item(sze_t index)
        {
          return values[index];
        };
      };
      
      std::unique_ptr<base> holder;
      
      template<typename ... Types>
      SomeClass(Types ... t)
        : base{std::make_unique<impl<std::common_type_t<Types...>>>(std::forward<Types>(t))}
      {
      }
      }
      
      Type & get_item(size_t index)
      {
        return holder->get_item(index);
      }
      

      【讨论】:

        猜你喜欢
        • 2019-04-17
        • 1970-01-01
        • 1970-01-01
        • 2022-10-20
        • 1970-01-01
        • 2019-12-25
        • 2021-04-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多