繁体   English   中英

C ++为类模板提供初始化列表构造函数

[英]C++ Supply initializer-list constructor for class template

我有一个带有模板参数T的类模板Templ,而Templ类有一个类型为T的数据成员,称为obj。 我编写了一个可变参数构造函数模板,它将参数转发给obj的构造函数:

template <class T>
class Templ
{
public:
     template <class... Args> explicit Templ (Args&&... args)
     : obj (std::forward<Args>(args)...)
     {
     }
private:
     T obj;
};

现在我意识到类型T可能是一个带有init-list构造函数的类,我希望它可以通过Templ访问。 所以我检查了std::list::emplacestd::make_shared做了什么。 它们具有像我一样的可变函数,但它们没有覆盖init-list的覆盖。 由于某些原因。

所以第一个问题:为什么? 我的意思是,如果我使用一个带有init-list ctor的类T,然后我使用std::list<T>怎么办? 为什么list :: \\ templates没有带初始化列表的版本? 也许有一个很好的理由我应该这样做...所以我想知道。

此外,无论STL做什么 - 我应该提供一个init-list ctor作为好的设计吗? 我的意思是,它就像可变的ctor,对吗? 允许用户选择与Templ <>一起使用的任何类型或类T,并直接调用为T定义的任何ctor。即使它是一个接受init-list的ctor。

转发initializer_list构造函数的问题是除了最简单的参数类型之外的所有参数类型都不可推导( 模板并不总是猜测初始化列表类型 ):

#include <map>
template<typename T> struct U {
   T t;
   template<typename...A> explicit U(A&&...a): t(std::forward<A>(a)...) {}
   template<typename L, typename = typename std::enable_if<
      std::is_constructible<T, std::initializer_list<L>>::value>::type>
      explicit U(std::initializer_list<L> l): t(l) {}
};
U<std::map<int, int>> m{{{0, 1}, {2, 3}}};  // fails, couldn't deduce 'L'

由于在大多数情况下你必须编写m{std::initializer_list<...>{...}} ,因此仅仅为原语提供它并没有多大意义,当然也不是标准。

如果您认为任何有趣的initializer_list参数可能适用于容器类型,您可以查看可选的支持initializer_list构造的方法,该模板可能包装容器

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM