- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写 C++98(抱歉),但使用的是 C 库,它有许多对象存储在以下形式的数据结构中:
struct c_container
{
size_t len;
int data[1];
};
struct c_container *make_container(size_t n)
{
if (n == 0)
return NULL;
struct c_container *rv = (struct c_container *)malloc(sizeof(rv->len) + n*sizeof(rv->data));
rv->len = n;
return rv;
}
我想使用 BOOST_FOREACH
进行 C++ 风格的迭代,但这行不通。 (手动调用 range_begin 和 range_end 函数的“旧式”确实有效)。
inline int *range_begin(c_container *c)
{
return c ? &c->data[0] : NULL;
}
inline int *range_end(c_container *c)
{
return c ? &c->data[c->len] : NULL;
}
inline const int *range_begin(const c_container *c)
{
return c ? &c->data[0] : NULL;
}
inline const int *range_end(const c_container *c)
{
return c ? &c->data[c->len] : NULL;
}
namespace boost
{
template<>
struct range_mutable_iterator<c_container *>
{
typedef int *type;
};
template<>
struct range_const_iterator<c_container *>
{
typedef const int *type;
};
}
int main()
{
c_container *coll = make_container(3);
coll->data[0] = 1;
coll->data[1] = 42;
coll->data[2] = -1;
BOOST_FOREACH(int i, coll)
{
std::cout << i << std::endl;
}
}
根据 http://www.boost.org/doc/libs/1_65_1/doc/html/foreach/extensibility.html,这就是应该的所有必要条件(我已经用类(class)测试过)
但是,该示例使用了类,而我使用的是指向类的指针。根据我的调查,它似乎正在使用仅适用于 const char *
和 const wchar_t *
的代码路径:
In file included from boost-foreach.cpp:6:0:
/usr/include/boost/foreach.hpp: In function ‘bool boost::foreach_detail_::done(const boost::foreach_detail_::auto_any_base&, const boost::foreach_detail_::auto_any_base&, boost::foreach_detail_::type2type<T*, C>*) [with T = c_container, C = mpl_::bool_<false>, const boost::foreach_detail_::auto_any_base& = const boost::foreach_detail_::auto_any_base&]’:
boost-foreach.cpp:65:5: instantiated from here
/usr/include/boost/foreach.hpp:749:57: error: no match for ‘operator!’ in ‘!* boost::foreach_detail_::auto_any_cast [with T = c_container*, C = mpl_::bool_<false>, typename boost::mpl::if_<C, const T, T>::type = c_container*, const boost::foreach_detail_::auto_any_base& = const boost::foreach_detail_::auto_any_base&](((const boost::foreach_detail_::auto_any_base&)((const boost::foreach_detail_::auto_any_base*)cur)))’
/usr/include/boost/foreach.hpp:749:57: note: candidate is: operator!(bool) <built-in>
是否有一些额外的 boost 特性可以专精或其他什么?
最佳答案
似乎很难为指针 类型定义范围函数。但是您可以直接为 c_container
定义它们。代码如下所示:
#include <cstdlib>
#include <iostream>
#include <boost/foreach.hpp>
struct c_container
{
size_t len;
int data[1];
};
struct c_container *make_container(size_t n)
{
if (n == 0)
return NULL;
struct c_container *rv = (struct c_container *)malloc(sizeof(rv->len) + n * sizeof(rv->data));
rv->len = n;
return rv;
}
inline int *range_begin(c_container &c)
{
return c.len > 0 ? &c.data[0] : NULL;
}
inline int *range_end(c_container &c)
{
return c.len > 0 ? &c.data[c.len] : NULL;
}
inline const int *range_begin(const c_container &c)
{
return c.len > 0 ? &c.data[0] : NULL;
}
inline const int *range_end(const c_container &c)
{
return c.len > 0 ? &c.data[c.len] : NULL;
}
namespace boost
{
template<>
struct range_mutable_iterator<c_container>
{
typedef int *type;
};
template<>
struct range_const_iterator<c_container>
{
typedef const int *type;
};
}
#define MY_FOREACH(x, y) BOOST_FOREACH(x, *y)
int main()
{
c_container *coll = make_container(3);
coll->data[0] = 1;
coll->data[1] = 42;
coll->data[2] = -1;
//BOOST_FOREACH(int i, *coll)
MY_FOREACH(int i, coll)
{
std::cout << i << std::endl;
}
}
请注意,BOOST_FOREACH
循环不会遍历指针类型。作为解决方法,您可以定义自己的 FOREACH
,如上面的代码所示。
关于c++ - BOOST_FOREACH 可以定制为指针类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47008591/
我有一个包含一些数据的类,我想添加 begin()和 end()提供数据 ID 迭代器的函数。 我正在使用 Boost counting_iterator : #include #include
我正在编写 C++98(抱歉),但使用的是 C 库,它有许多对象存储在以下形式的数据结构中: struct c_container { size_t len; int data[1];
我尝试使用 Boost 库,我复制了整个 boost 文件夹,除了 docs、libs、more、status、tools 文件夹。 当我尝试使用下面的代码块时,我的编译器无法识别两件事。 vecto
我想使用 BOOST_FOREACH在我的代码库中使用我无法更改的遗留容器类型之一。 我在该类型上定义了以下方法: .length() 返回容器中元素的当前数量 .operator[](unsigne
我尝试在模板函数中使用 BOOST_FOREACH 和自定义但类型参数独立的迭代器。我收到 4-5 个错误,表明我的迭代器类没有很好地定义为迭代器。 在不使用 BOOST_FOREACH 的情况下重写
我想知道在调用之前获取对 vector 的引用是否有任何好处BOOST_FOREACH 或返回引用的方法调用是否会被自动使用?例如,以下两个循环中的哪一个将等同于第三个循环? vector& my_m
给定以下简单代码: list m_listOfOBjects; .... MyClass* ptrToMyClass; BOOST_FOREACH(MyClass object, m_listOfOb
我实现了一个简单的类 MyClass,其中有一个分配有 new 的数组(我知道我可以使用 STL 容器,但我试图理解他们是如何工作的)。我还创建了一个迭代器子类,能够迭代 MyClass 对象的所有元
我想使用 BOOST_FOREACH 宏来迭代我的 vector 中的一堆值。 vector 看起来像这样: struct _Element { int key; // more va
我测试了我的程序,并决定将 BOOST_FOREACH 宏更改为带有 const_iterator 的简单 for 循环。 我收到了意想不到的结果:使用 for 时程序运行速度变慢。 然后我写了一个小
我有一个 BOOST_FOREACH 循环来遍历列表。不幸的是,我还需要将迭代器缓存到特定项。 typedef List::iterator savedIterator; BOOST_FOREACH(
当使用BOOST_FOREACH时,下面的代码安全吗? BOOST_FOREACH (const std::string& str, getStrings()) { ... } ... std::
如果 BOOST_FOREACH 正在迭代的容器在 BOOST_FOREACH 范围内发生更改,会发生什么情况? BOOST_FOREACH 是否“卡住”初始状态? 最佳答案 在这种情况下,行为是未定
考虑以下代码,使用 BOOST_FOREACH 宏迭代一个侵入式列表: #include #include typedef boost::intrusive::list > MyList; voi
来自 boost doc , This results in near-optimal code generation; the performance of BOOST_FOREACH is usu
我有一个场景 vector ,vector .迭代元素的正确方法是什么,是否作为引用? 例如这个: BOOST_FOREACH(Scene scene, mScenes) { .....
我有以下宏: #define FOREACH(decl, c) BOOST_FOREACH(decl, std::make_pair((c).begin(), (c).end())) (我正在使用这个
我想听听您对 BOOST_FOREACH 使用的建议。 我已经阅读了它,因为它是一个非常沉重的标题,但实际上并不推荐它。 此外,它强制使用“break”和“continue”语句,因为您不能真正拥有由
我知道应该最后归咎于 boost 或编译器,但我在这里看不到其他解释。我正在使用 msvc 2008 SP1 和 boost 1.43。 在以下代码片段中,执行永远不会离开 第三个 BOOST_FOR
你可以使用 boost::filesystem 和 BOOST_FOREACH 遍历目录中的所有文件吗?我试过了 path dirPath = ... int fileCount = 0; BOOST
我是一名优秀的程序员,十分优秀!