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_构造函数初始化列表(不更改其类型)?
生成 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_array在auto请注意,不建议
使用:
#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,但如果是,请在本地禁用警告。
| 归档时间: |
|
| 查看次数: |
1483 次 |
| 最近记录: |