复制到较小类型的数据结构时丢失数据警告

时间:2013-08-28 13:37:16

标签: c++

我正在使用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我可以放一个演员。

编辑:代码将在其他编译器中使用,我不赞成使用编译指示。

3 个答案:

答案 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)

这当然是编译器特定的。