我希望执行双向量向浮点向量的缩小转换。我不希望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);我不想支付错误检查的性能损失。
答案 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