我正在使用Visual Studio 2013,我有以下代码:
void f()
{
std::vector<short> vecshort(10);
std::vector<long> veclong(10);
std::copy(veclong.begin(), veclong.end(), vecshort.begin());
}
这会发出警告:
warning C4244: '=' : conversion from 'long' to 'short', possible loss of data
麻烦的是真实代码在某些模板中。用户可以实例化模板以便发生此警告,但代码的逻辑可以防止任何实际的数据丢失。如何以一种很好的方式抑制此警告?如果它不在std::copy
我可以放一个演员。
编辑:代码将在其他编译器中使用,我不赞成使用编译指示。
答案 0 :(得分:4)
我认为你最好的选择是使用std::transform
和谓词(或lambda)为你做演员(因为你断言没有数据丢失转换为较小的类型)。
template <typename To>
struct convert_to
{
template<typename From>
To operator()(From source) const { return static_cast<To>(source); }
};
std::transform(veclong.begin(), veclong.end(), vecshort.begin(), convert_to<short>());
答案 1 :(得分:1)
您可以使用std::copy
:
std::transform
short to_short(long i)
{
return static_cast<short>(i);
}
std::vector<short> vShort;
std::vector<long> vLong(10);
std::transform(vLong.begin(), vLong.end(), std::back_inserter<std::vector<short>>(vShort), to_short);
你也可以在lambda中进行演员表。
答案 2 :(得分:0)
您可以使用#pragma来禁止特定警告。
> #pragma warning(push)
> #pragma warning(disable: 4244) // possible loss of data
> #include <algorithm>
> #pragma warning(pop)
这当然是编译器特定的。