如何使用显式强制转换来抑制此警告?

时间:2015-07-10 15:59:32

标签: c++ boost stl

以下代码:

#include <cstdint>
#include <vector>
#include <boost/range/irange.hpp>

int main() {
    int64_t first = 0, last = 10;
    std::vector<double> result = boost::copy_range<std::vector<double>>(boost::irange(first, last));
}

生成警告(以及100多行模板化调用堆栈跟踪):

1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xmemory0(600):
warning C4244: 'initializing' : conversion from 'unsigned __int64' to 'double', possible loss of data

我想告诉编译器我并不关心我的int64_t被转换为double。我也不想使用32位的int。我通常会使用static_cast<double>(my64BitInt)来解决这个问题,但这对范围无效。现在我正在使用编译器编译指示来抑制警告但这并不理想。

编辑:这是一个带有完整编译器输出的pastebin

2 个答案:

答案 0 :(得分:2)

我认为你需要使用std::transform而不是boost copy_range。另外,我更喜欢使用内置static_cast上的boost numeric cast

这是一个有效的例子:

template <class DST, class SRC>
struct Convert
{
    DST operator()(SRC s) { return boost::numeric_cast<DST>(s); }
};

int main(int argc, const char* argv[])
{
    int64_t first = 0, last = 10;
    auto my_range = boost::irange(first, last);
    std::vector<double> result(my_range.size());
    std::transform(my_range.begin(), my_range.end(), result.begin(), Convert<double, int64_t>());

    std::cout << "result: ";
    std::copy(result.begin(), result.end(), std::ostream_iterator<double>(std::cout, ", "));

}

以上代码使用transform和仿函数Convert。如果您更喜欢lambda,那么这也适用(并且更简洁):

std::transform(my_range.begin(), my_range.end(), result.begin(), 
               [](int64_t ival) {
                   return boost::numeric_cast<double>(ival);
               }
               );

编辑添加 iota变种

如上所述,要生成[0,10]范围内的双精度矢量,可以使用std library iota(来自#include numeric)函数。这是一个完整的(并且更短)iota示例,不需要提升:

std::vector<double> result(10);
std::iota(result.begin(), result.end(), 0.0);
std::cout << "result: ";
std::copy(result.begin(), result.end(), std::ostream_iterator<double>(std::cout, ", "));

谢谢你,指出来。

答案 1 :(得分:2)

菲尔说的是什么;

但是在这种情况下,您可以使用the iota algorithm更简单:

#include <vector>
#include <boost/range/algorithm_ext.hpp>

int main() {
    std::vector<double> result(10);
    boost::iota(result, 0);
}