gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:40:25 25 4
gpt4 key购买 nike

我有一个带有模板参数 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做。他们有一个像我一样的可变参数函数,但他们没有采用初始化列表的覆盖。出于某种原因。

第一个问题:为什么?我的意思是,如果我将某个类 T 与初始化列表构造函数一起使用,然后使用 std::list<T> 会怎么样? ?为什么 list::emplace 没有采用 initializer_list 的版本?也许我也有一个很好的理由...所以我想知道。

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

最佳答案

转发的问题initializer_list constructors 是除了最微不足道的参数类型之外的所有参数都是不可推导的(Templates don't always guess initializer list types):

#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参数可能是针对容器类型的,您可以查看 Optionally supporting initializer_list construction for templates maybe wrapping containers 中采用的方法.

关于C++ 为类模板提供初始化列表构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14805005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com