在成员初始化列表中填写std :: array

man*_*lio 11 c++ effective-c++ c++11 stdarray

以下代码有效,但我想避免警告:

警告:'fitness :: vect_'应该在成员初始化列表中初始化[-Weffc ++]

当用g++ -Weffc++开关编译时:

#include <array>

template<class T, unsigned N>
class fitness
{
public:
  explicit fitness(T v)
  {
    static_assert(N, "fitness zero length");

    vect_.fill(v);
  }

private:
  std::array<T, N> vect_;
};

int main()
{
  fitness<double, 4> f(-1000.0);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我应该忽略这个警告吗?有没有办法填写vect_构造函数初始化列表(不更改其类型)?

Yak*_*ont 1

生成 a 的函数filled_array应该省略其返回值:

template<unsigned N, typename T>
std::array<T, N> filled_array_sized( T const& t ) {
  std::array<T, N> retval;
  retval.fill( t );
  return retval;
}
Run Code Online (Sandbox Code Playgroud)

但这需要至少传递大小N,如果不是类型的话T

template<typename T>
struct array_filler {
  T && t;
  template<typename U, unsigned N>
  operator std::array<U, N>()&& {
    return filled_array_sized<N, U>( std::forward<T>(t) );
  }
  array_filler( T&& in ):t(std::forward<T>(in)) {}
};
template<typename T>
array_filler< T >
filled_array( T&& t ) {
  return array_filler<T>( t );
}
Run Code Online (Sandbox Code Playgroud)

请注意,将 的返回值存储filled_arrayauto请注意,不建议

使用:

#include <array>

template<class T, unsigned N>
class fitness
{
public:
  explicit fitness(T v): vect_( filled_array( std::move(v) ) ) {
    //...
  }
//...
Run Code Online (Sandbox Code Playgroud)

我不知道上面的代码在执行时是否会产生警告filled_array_size,但如果是,请在本地禁用警告。