2

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

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

4

3 回答 3

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>());
于 2013-08-28T13:43:28.150 回答
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 中进行强制转换。

于 2013-08-28T13:45:08.643 回答
0

您可以使用#pragma 来抑制特定警告。

> #pragma warning(push)
> #pragma warning(disable: 4244) // possible loss of data
> #include <algorithm> 
> #pragma warning(pop)

这当然是编译器特定的。

于 2013-08-28T13:40:57.317 回答