gpt4 book ai didi

c++11 - C++ range-for 和 boost::irange

转载 作者:行者123 更新时间:2023-12-03 00:38:17 31 4
gpt4 key购买 nike

我正在使用 boost::irange 并创建了一个辅助函数,通过消除对显式模板参数的需要来简化代码。我不明白为什么它不起作用。代码如下:

#include <iostream>
#include <boost/range/irange.hpp>

template<typename T>
boost::irange<T> range_from_zero(T limit)
{
return boost::irange<T>(T(), limit);
}

int main() {
size_t end = 100;
for (auto i : range_from_zero(0,end))
std::cout << i << ' ';

return 0;
}

这里有一个现场版本 https://ideone.com/VVvW6e ,这会产生编译错误

prog.cpp:5:8: error: 'irange<T>' in namespace 'boost' does not name a type
boost::irange<T> range_from_zero(T limit)
^
prog.cpp: In function 'int main()':
prog.cpp:12:41: error: 'range_from_zero' was not declared in this scope
for (auto i : range_from_zero(0,end))

如果我直接在 range-for 中使用 boost::irange ,那么它可以工作:

#include <iostream>
#include <boost/range/irange.hpp>

int main() {
size_t end = 100;
for (auto i : boost::irange<size_t>(0,end))
std::cout << i << ' ';

return 0;
}

这工作正常:https://ideone.com/TOWY6H

我认为也许是在函数的返回上使用 range-for 时出现的问题,但事实并非如此;这可以使用 std::vector:

#include <iostream>
#include <boost/range/irange.hpp>

template<typename T>
std::vector<T> range_from_zero(T limit)
{
auto range = boost::irange<T>(T(), limit);
return { std::begin(range), std::end(range) };
}

int main() {
size_t end = 100;
for (auto i : range_from_zero(end))
std::cout << i << ' ';

return 0;
}

参见https://ideone.com/TYRXnC

请问有什么想法吗?

最佳答案

<小时/>

但是,首先, Live On Coliru 有什么问题吗?

for (size_t i : irange(0, 100))

甚至Live On Coliru

size_t end = 100;
for (auto i : irange(0ul, end))
<小时/>

irange是一个函数模板,不能用作返回类型。

返回类型为integer_rangestrided_integer_range 。因此,irange已经是您正在寻找的功能。

只是,您没有传递可以明确推导出来的参数。如果您可以允许这样做,请“复制”irange()使用单独的模板参数类型作为边界值来实现,并使用例如std::common_type<T1,T2>::type作为范围元素。

<小时/>

这是我的写作尝试range_from_zero没有在接口(interface)中命名实现细节:

Live On Coliru

#include <iostream>
#include <boost/range/irange.hpp>

template <typename T>
auto izrange(T upper) -> decltype(boost::irange(static_cast<T>(0), upper)) {
return boost::irange(static_cast<T>(0), upper);
}

int main() {
size_t end = 100;
for (size_t i : izrange(end))
std::cout << i << ' ';
}

关于c++11 - C++ range-for 和 boost::irange,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29966216/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com