【问题标题】: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);
}