我想创建一个小宏来模拟VC2010中的(自动项目:容器),然后我可以在它发布时替换为真实的构造。
有BOOST_FOREACH,但是我想要自动支持。
我尝试过创建一个宏。但是,当解除引用的迭代器是常量类型时,它会失败。
#define _LIB_FOREACH_LINENAME_CAT(name, line) name##line
#define _LIB_FOREACH_LINENAME(name, line) _LIB_FOREACH_LINENAME_CAT(name, line)
#define LIB_AUTO_FOREACH(item, expr) \
decltype((expr))&& _LIB_FOREACH_LINENAME(con, __LINE__)((expr)); auto _LIB_FOREACH_LINENAME(it, __LINE__) = _LIB_FOREACH_LINENAME(con, __LINE__).begin(); for(auto (item) = *_LIB_FOREACH_LINENAME(con, __LINE__).begin(); _LIB_FOREACH_LINENAME(it, __LINE__) != _LIB_FOREACH_LINENAME(con, __LINE__).end(); ++_LIB_FOREACH_LINENAME(it, __LINE__), (item) = *_LIB_FOREACH_LINENAME(it, __LINE__))
任何人都可以接受挑战以纠正我的问题或找到有效的实施方案吗?
编辑:
请注意,(expr)只应评估一次。
答案 0 :(得分:3)
有BOOST_FOREACH,不过我 想要自动支持。
BOOST_FOREACH
似乎支持C ++ 0x auto
关键字。
正如你的宏一样,提升者的优势更胜一筹。它也适用于数组(可能是零终止的字符数组),并允许您使用循环变量的引用,而不是让它从空气中出现。
答案 1 :(得分:2)
而不是
decltype((expr))&&
你应该写一下
auto&&
您的方法存在的问题是它不适用于不提供开始/结束成员函数的范围(例如数组)。建议的C ++ 0x for-range循环使用自由开始/结束函数和参数依赖查找来解决这个问题。
将代码块作为宏参数包含在内可能是个好主意:
#include <cstddef>
namespace for_range_helpers {
template<class Container>
auto begin(Container& c) -> decltype(c.begin())
{ return c.begin(); }
template<class Container>
auto end(Container& c) -> decltype(c.end())
{ return c.end(); }
template<class T, std::size_t N>
T* begin(T (&array)[N])
{ return array+0; }
template<class T, std::size_t N>
T* end(T (&array)[N])
{ return array+N; }
} // namespace for_range_helpers
#define FOR_RANGE(init_,expression_,...) \
do { \
using ::for_range_helpers::begin; \
using ::for_range_helpers::end; \
auto&& range_ = expression_; \
for (auto iter_ = begin(range_), end_ = end(range_); \
iter_ != end_; ++iter_) \
{ \
init_ = *iter_; \
__VA_ARGS__ \
} \
} while (0)
#include <iostream>
#include <vector>
int main()
{
int arr[] = {2,3,5,7,11};
std::vector<int> vec;
FOR_RANGE(auto i, arr,
vec.push_back(i);
);
FOR_RANGE(auto i, vec,
std::cout << ' ' << i;
);
std::cout << '\n';
}
答案 2 :(得分:0)
在VS2010中,您还可以为每个(auto i in v)扩展名使用微软。就个人而言,我更喜欢Boosts的跨平台解决方案。
另见here。
也许可以编写一个将C ++ 0x语法转换为Microsofts语法的宏。