gpt4 book ai didi

可从任何序列类型初始化的 C++ 类

转载 作者:搜寻专家 更新时间:2023-10-31 00:11:48 25 4
gpt4 key购买 nike

我想要一个可以从任何序列初始化的类,这意味着从任何具有方法 begin() 和 end() 返回迭代器的类型。

template<typename B>
class A
{
public:
A(any_sequence_type<B> arglist)
{
for(B b : arglist)
init_members(b);
}
}

我要编译以下内容:

A<int> a = {1, 2, 3};
A<int> b = std::vector<int>();
A<Something> c = MyClassWithBeginAndEnd();

这可能吗?

编辑:

使用模板构造函数的建议解决方案不起作用。GCC 说:模板参数推导/替换失败:无法推导模板参数“T”。Clang 说:候选模板被忽略:无法推断模板参数“T”。

不过,如果我明确地强制转换初始化程序,事情就会开始起作用。

A a = A({B(), B(), B()}); // does not work
A a = (std::initializer_list<B>){B(), B(), B()}; // works

这是为什么?

最佳答案

使用模板构造函数:

template<typename B>
class A
{
public:
template <typename T>
A(T&& arglist)
{
for (auto&& b : arglist) {
init_members(b);
}
}

// overload for initializer_list
A(std::initializer_list<B> arglist) {
for (auto&& b : arglist) {
init_members(b);
}
}

};

如果 T 不提供 begin/end 并且内容不可转换为 B.

您可以使用 SFINAE 来限制允许的类型 T,因此在误用的情况下调用站点而不是在构造函数内部时出错。

Demo

关于可从任何序列类型初始化的 C++ 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32618691/

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