gpt4 book ai didi

c++ - 使用 initializer_list 初始化数组/将 initializer_list 转换为参数包

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

我需要使用 initializer_list 来初始化编译时大小的类数组。我已经知道我可以使用参数包构造函数并当场初始化它,但在这种情况下我需要使用 initializer_list。如果可能,我还想避免动态初始化数组。这是伪代码:

template<typename Type, std::size_t Length>
class Test
{
public:
Test(const std::initializer_list<Type> args)
: m_tData(args) //<-- Doesn't work of course
{}

private:
Type m_tData[Length];
};

当然,对于非常量类型,我可以这样做

Test(const std::initializer_list<Type> args)
{
std::copy(args.start(), args.end(), m_tData);
}

但是如果我尝试使用像 Test<const int, 3>({1, 2, 3}) 这样的 const 类,这将不起作用.我是否被迫使用模板特化来使内部数组实际上不是 const,以便我可以从构造函数主体中初始化它?

我正在使用 C++20。我看过How do I initialize a member array with an initializer_list?但想知道从那时起是否有任何变化。

最佳答案

可能的解决方案:

template<typename Type, std::size_t Length>
class Test
{
public:
Test(std::initializer_list<Type> args) :
Test(args, std::make_index_sequence<Length>{})
{
assert(args.size() == Length);
}

private:
template<std::size_t... ii>
Test(std::initializer_list<Type> args, std::index_sequence<ii...>) :
m_tData{(*(args.begin() + ii))...}
{}

Type m_tData[Length];
};

https://godbolt.org/z/d8Zg3q

Is there a way I could still support initializer_lists of lesser lengths than the templated length? Say something like Test<const int, 5>({1, 2, 3})?

如果剩余的元素应该用Type{}初始化, 只需要稍微修改一下:

Test(std::initializer_list<Type> args) :
Test(args, std::make_index_sequence<Length>{})
{
assert(args.size() <= Length);
}

template<std::size_t... ii>
Test(std::initializer_list<Type> args, std::index_sequence<ii...>) :
m_tData{(ii < args.size() ? *(args.begin() + ii) : Type{})...}
{}

关于c++ - 使用 initializer_list 初始化数组/将 initializer_list 转换为参数包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56447109/

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