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::emplace
和std::make_shared
做什么。它们有一个像我这样的可变参数函数,但它们没有采用初始化列表的覆盖。出于某种原因。
所以第一个问题:为什么?我的意思是,如果我使用带有初始化列表 ctor 的某个类 T 然后使用 std::list<T>
怎么办?为什么 list::emplace 没有需要initializer_list的版本?也许我应该这样做是有充分理由的......所以我想知道。
另外,不管 STL 做什么 - 我应该提供一个初始化列表 ctor 作为好的设计吗?我的意思是,它就像可变参数ctor一样,对吧?允许用户选择要与 Templ 一起使用的任何类型或类 T<>并直接调用为 T 定义的任何 ctor。即使它是一个 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构造可能包装容器中采用的方法。
- 一对向量构造函数:初始值设定项列表与显式构造
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- 构造函数/函数声明参数列表中的统一初始化
- 在初始化列表之外手动调用基类的构造函数
- 采用初始值设定项列表的构造函数
- 类内初始化与构造函数初始化列表的顺序
- 结构数组的构造函数错误,错误消息:没有构造函数实例与参数列表匹配
- 大括号括起来的初始值设定项列表中的短 c++ 类构造函数
- 如何在初始化列表中的构造函数之后初始化变量/对象?
- 如何在构造函数初始值设定项列表中使用 n 个元素初始化 std::vector<std::time_t>
- 在构造函数初始化列表中使用 std::variant
- 没有构造函数模型的实例::模型匹配参数列表
- 在c++中为链接列表创建复制构造函数/函数
- 解释了构造函数成员初始化列表
- C2436 '{ctor}':构造函数初始值设定项列表中的成员函数或嵌套类
- 不带初始值设定项的构造函数列表,其中包含带有已删除构造函数的对象
- 空向量的构造函数列表初始化
- C++ 中的构造函数列表
- 为什么初始化构造函数列表参数时会发生异常?
- 如何在类构造函数列表中初始化结构