如何禁用Visual Studio警告C4244 for std :: vector copy或赋值隐式缩小转换

时间:2017-10-23 14:15:47

标签: c++ visual-studio c++11

希望执行双向量向浮点向量的缩小转换。我不希望Visual Studio抛出警告C4244,“可能丢失数据”,即缩小转换。

请不要发表评论或回答说我不应该这样做。我知道后果。我只想抑制警告。在该特定功能的范围之外禁用警告是不可接受的,例如,全球通过项目设置。

我也想使用vector :: copy或vector :: assign。使用static_cast<>避免通过transform()或for_each()发出警告是......对我的口味太明确了。所以这个问题是如何禁用警告,而不是避免它。

我的警告抑制尝试不起作用:

vector<float> DoubleVectorToFloat( vector<double> & x ){
  #pragma warning( push )
  #pragma warning( disable : 4244 ) 
  return vector<float>( x.begin(), x.end() );
  #pragma warning( pop )  
}

我知道禁用警告很糟糕。但是一种尺寸并不适合所有人。我的库是实时的,处理10个MiB / s。我想要调用模板_Copy_unchecked1(etc);我不想支付错误检查的性能损失。

2 个答案:

答案 0 :(得分:4)

请改用:

std::vector<float> DoubleVectorToFloat(const std::vector<double>& x)
{
    std::vector<float> r;
    r.reserve(x.size());

    std::transform(x.begin(), x.end(), std::back_inserter(r),
                   [](double a) { return static_cast<float>(a); });
    return r;
}

std::transform是将类型的矢量转换为另一种类型的矢量的正确方法。

强烈建议使用此方法,而不是使用向量构造函数并使警告静音。

答案 1 :(得分:2)

要禁用此类警告,您可能必须将此功能放入其自己的模块中并禁用顶部的警告:

// top-of-file
#pragma warning( disable : 4244 ) 

// All your includes here

std::vector<float> DoubleVectorToFloat( std::vector<double> & x ){
  return std::vector<float>( x.begin(), x.end() );
}
// end-of-file