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

C++ 如何使用显式强制转换来抑制此警告?,c++,boost,stl,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(fir

以下代码:

#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));
}
我想告诉编译器我不在乎我的
int64\t
被转换成
double
。我也不想使用32位int。我通常会使用
static\u cast(my64BitInt)
来解决这个问题,但这在一定范围内不起作用。现在我使用编译器pragmas来抑制警告,但这并不理想


编辑:这里有一个完整的编译器输出。

我认为您需要使用而不是boost copy\u范围。此外,我更喜欢使用内置的
static\u 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, ", "));

}
编辑添加物联网变体

正如sehe所指出的,要生成[0,10]范围内的双倍向量,可以使用(from)函数。下面是一个完整(且更短)的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, ", "));
std::向量结果(10);
std::iota(result.begin()、result.end()、0.0);
菲尔说了什么

但是,在这种情况下,您可以使用以下方法执行更简单的操作:

#包括
#包括
int main(){
std::向量结果(10);
boost::物联网(结果为0);
}

1)如果您认为自己永远不会关心这个问题,您可以在项目设置中而不是使用pragmas来抑制警告。2)为什么将
first
last
声明为
int64\t
,而不是
double
?@visualstudio中的celticminstrel pragmas允许您抑制特定代码行上的警告,并且我知道(你也可以用clang/gcc来做,尽管语法有点不同。)我只是指出这一点,部分原因是我个人发现这个特别的警告通常是无用的,而不是有用的,部分原因是万一你碰巧同意。
std::transform(my_range.begin(), my_range.end(), result.begin(), 
               [](int64_t ival) {
                   return boost::numeric_cast<double>(ival);
               }
               );
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, ", "));
#include <vector>
#include <boost/range/algorithm_ext.hpp>

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