【问题标题】:std::initializer_list as std::array constructorstd::initializer_list 作为 std::array 构造函数
【发布时间】:2016-05-31 01:08:51
【问题描述】:

我需要将参数传递给看起来像这样的最小示例的包装类:

template<class TStack, unsigned int TBins>
class Wrapper : Stack<......>
{
    std::array<TStack, TBins> m_oStacks;

    template<typename ... Args>
    Wrapper(std::initializer_list<const unsigned int> const& size, Args&&... args)
    : Stack<.......>(args), m_oStacks{5,2,3,4,5,6,7,8,9,10}
    //, m_oStacks(size) //,m_oStacks{size} //,m_oStacks{{size}}
    {
        //m_oStacks = { size };           
    }
};

我尝试使用 initializer_list 大小初始化数组,但没有任何效果(源代码的注释部分)只有常量 {5,2,3,4,5,6,7,8,9,10} 部分有效

有人知道原因和解决办法吗?

真诚的 马蒂罗

编辑 1:主要问题是 TStack(在大多数情况下)没有默认构造函数,所以我需要在构造时初始化数组

【问题讨论】:

  • @Matyro 类 std::array 没有接受 initializer_list 的构造函数。您应该自己将 initializer_list 复制到数组中。
  • 使用std::array&lt;TStack, TBins&gt;而不是std::initializer_list&lt;const unsigned int&gt;,它也可以被列表初始化,并且std::array本身确实有一个复制构造函数
  • 该解决方案运行良好,谢谢

标签: c++ arrays c++11 initializer-list


【解决方案1】:

std::initializer_list:

template <typename TStack, std::size_t TBins>
class Wrapper
{
public:
    Wrapper(std::initializer_list<unsigned int> il)
        : Wrapper(il, std::make_index_sequence<TBins>{})
    {
    }

private:
    template <std::size_t... Is>
    Wrapper(std::initializer_list<unsigned int> il, std::index_sequence<Is...>)
        : m_oStacks{{ *(il.begin() + Is)... }}
    {
    }

    std::array<TStack, TBins> m_oStacks;
};

DEMO

std::array:

template <typename TStack, std::size_t TBins>
class Wrapper
{
public:
    Wrapper(const std::array<unsigned int, TBins>& a)
        : Wrapper(a, std::make_index_sequence<TBins>{})
    {
    }

private:
    template <std::size_t... Is>
    Wrapper(const std::array<unsigned int, TBins>& a, std::index_sequence<Is...>)
        : m_oStacks{{ a[Is]... }}
    {
    }

    std::array<TStack, TBins> m_oStacks;
};

DEMO 2

【讨论】:

  • 我一直不这么认为。看起来很棒。
  • 如果il的长度小于TBINS,第一种情况会导致UB。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-29
  • 1970-01-01
  • 2020-09-22
  • 1970-01-01
  • 2011-01-22
  • 2014-05-02
  • 2015-09-04
相关资源
最近更新 更多