以下代码:
#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));
}
Run Code Online (Sandbox Code Playgroud)
生成警告(以及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
Run Code Online (Sandbox Code Playgroud)
我想告诉编译器我不关心我int64_t的转换double.我也不想使用32位的int.我通常会用它static_cast<double>(my64BitInt)来解决这个问题,但这不适用于范围.现在我正在使用编译器编译指示来抑制警告但这并不理想.
编辑:这是一个带有完整编译器输出的pastebin.
我认为您需要使用std::transform而不是 boost copy_range。另外,我更喜欢使用boost 数字转换而不是内置的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, ", "));
}
Run Code Online (Sandbox Code Playgroud)
上面的代码transform与函子一起使用Convert。如果您更喜欢 lambda,这也可以(并且更简洁):
std::transform(my_range.begin(), my_range.end(), result.begin(),
[](int64_t ival) {
return boost::numeric_cast<double>(ival);
}
);
Run Code Online (Sandbox Code Playgroud)
编辑 也添加iota 变体
正如 sehe 指出的,要生成 [0, 10) 范围内的双精度向量,可以使用std 库 iota(来自#include numeric)函数。这是一个完整的(而且更短的)iota 示例,不需要 boost:
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, ", "));
Run Code Online (Sandbox Code Playgroud)
谢谢你,sehe,指出这一点。
| 归档时间: |
|
| 查看次数: |
694 次 |
| 最近记录: |