我阅读了文档visit_each,但是如果每个用户都不得不重载它,就无法真正看到它的确切含义以及它的一般用途.有人关心赐教吗?
编辑:也许我只是如此困惑,因为以下是整个内容,<boost/visit_each.hpp>我只是没有看到"访问每个子对象"的任何"魔术":
namespace boost {
template<typename Visitor, typename T>
inline void visit_each(Visitor& visitor, const T& t, long)
{
visitor(t);
}
template<typename Visitor, typename T>
inline void visit_each(Visitor& visitor, const T& t)
{
visit_each(visitor, t, 0);
}
}
Run Code Online (Sandbox Code Playgroud)
也许有人可以给我一个具体的例子,说明这应该是什么样的/工作?
我怀疑该文档的重要部分是这一行:“库作者将被期望添加额外的重载,专门为其类的 T 参数,以便可以访问子对象。” 换句话说,它没有一般用途,它只是任何基于访问者的内省机制的通用名称。它的实现方式是,所有类型都会发生一些事情,无论它们的编写者是否意识到它的存在,因此您不会遇到编译时失败。
它对我来说似乎不太有用......实际上来说,它只是升压信号库的内部函数,但我想如果你使用该库专门研究你visit_each自己的类型不会有什么坏处。
他们提到寻找signals::trackable物体。因此,据推测,他们在信号库中为自己的类型提供了一些专业化。然后他们有一个is_trackable函子。或者类似的东西。
struct trackable { };
struct Introspective {
int a;
double b;
trackable c;
};
struct NotIntrospective {
int a;
double b;
trackable c;
};
template<typename Visitor, typename T>
inline void visit_each(Visitor& visitor, const T& t, long) {
visitor(t);
}
template<typename Visitor>
inline void visit_each(Visitor& visitor, const Introspective& t, int) {
visitor(t); //"visits" the object as a whole
//recursively visit the member objects; if unspecialized, will simply call `visitor(x)`
visit_each(visitor, t.a, 0);
visit_each(visitor, t.b, 0);
visit_each(visitor, t.c, 0);
}
struct is_trackable {
void operator()(const trackable&) {
//Do something
}
template<typename T>
void operator()(const T&) { }
}
int main() {
Introspective a;
NotIntrospective b;
trackable c;
visit_each(is_trackable(), a, 0); //calls specialized version, finds `a.c`
visit_each(is_trackable(), b, 0); //calls default version, finds nothing
visit_each(is_trackable(), c, 0); //calls default version, which "visits" the
//object itself, and finds that it is trackable
}
Run Code Online (Sandbox Code Playgroud)
关键是它visit_each本身没有任何魔力,除了提供一种调用方法以确保visit_each无法在无法识别的类型上进行编译之外。
| 归档时间: |
|
| 查看次数: |
584 次 |
| 最近记录: |