【问题标题】:Initialize template<size_t N> std::array<char, N> with ASCII spaces? [duplicate]用 ASCII 空格初始化 template<size_t N> std::array<char, N>? [复制]
【发布时间】:2017-05-06 14:52:25
【问题描述】:

我们可以用= { ' ', ' ', ' ' } 来初始化std::array&lt;char, 3&gt;,但是如果大小是由模板参数N 给出的呢?我们不能做类似std::string::string(size_type count, CharT ch) 的事情,用给定的ch 填充实例吗?

我应该看看std::integer_sequence 吗?

【问题讨论】:

  • 你可以随时fill定义后的数组。
  • @Someprogrammerdude 你说的只是非const 数组。使用const,它会变得和const std::array&lt;char, N&gt; arr([&amp;arr, ch] { std::remove_const_t&lt;decltype(arr)&gt; tmp; std::fill_n(tmp.begin(), tmp.size(), ch); return tmp; }()); 一样丑陋,好吧,这是可行的,但是......

标签: c++ arrays c++11 templates constructor


【解决方案1】:

您可以为此使用索引序列:

template <typename T, std::size_t...Is>
std::array<T, sizeof...(Is)> make_array(const T& value, std::index_sequence<Is...>)
{
    return {{(Is, value)...}};
}

template <std::size_t N, typename T>
std::array<T, N> make_array(const T& value)
{
    return make_array(value, std::make_index_sequence<N>());
}

Demo

【讨论】:

  • Is 映射到values 序列的有趣技巧,但是如果我们需要引入一个辅助函数,它并没有比fill_n() 中提出的fill_n() 提供太多好处@ 987654322@
  • @nodakai:它只进行一次初始化,但实际上,这两种解决方案基本上是等价的。
猜你喜欢
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
  • 2018-12-27
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
相关资源
最近更新 更多