2015-07-10 73 views
5

下面的代码:如何使用显式强制转换来抑制此警告?

#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+线模板调用堆栈跟踪):我想告诉大家,我不在乎,我int64_t编译器

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 

正在转换为double。我也不想使用32位int。我通常会使用static_cast<double>(my64BitInt)来解决这个问题,但这不适用于一个范围。现在我正在使用编译器编译来压制警告,但这并不理想。

编辑:这是一个pastebin与完整的编译器输出。

+0

1)您可以在您的项目设置,而不是与编译指示禁止警告,如果你认为你永远不会关心这个。 2)为什么'first'和'last'声明为'int64_t'而不是'double'? – celticminstrel

+0

Visual Studio中的@celticminstrel编译指示允许您抑制特定代码行的警告,并使其保留在项目的其余部分。 – IronMensan

+0

我知道。 (你也可以用clang/gcc来完成,虽然语法有些不同)。我只是指出它的部分原因,因为我个人发现这个特殊的警告无用而且有用,部分如果你碰巧同意。 – celticminstrel

回答

2

我想你需要使用std::transform而不是boost copy_range。另外,我更喜欢使用boost numeric cast而不是内置的static_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); 
       } 
       ); 

编辑添加丝毫变形太

由于sehe指出,产生双打的矢量范围[0 ,10),可以使用std library iota(来自#include numeric)的功能。这是一个完整的(和更短),丝毫不需要升压例如:

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, ", ")); 

谢谢sehe,指点出来。

2

菲尔说什么;

然而,在这种情况下,你可以做的更简单的使用the iota algorithm

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

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