2015-07-10 79 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); 
}