- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在寻找一些建议,以了解什么是处理 about 类(处理类)的方面的适当接口(interface),但它们不是他们正在处理的实际类的一部分(元方面)。这需要一些解释......
在我的具体示例中,我需要实现一个自定义 RTTI 系统,它比 C++ 提供的系统稍微复杂一些(我不会深入探讨为什么需要它)。我的基本对象是 FooBase
并且这个基类的每个子类都关联一个 FooTypeInfo
对象。
// Given a base pointer that holds a derived type,
// I need to be able to find the actual type of the
// derived object I'm holding.
FooBase* base = new FooDerived;
// The obvious approach is to use virtual functions...
const FooTypeInfo& info = base->typeinfo();
使用虚函数来处理对象的运行时类型对我来说并不合适。我倾向于将对象的运行时类型视为超出类范围的东西,因此它不应该是其显式接口(interface)的一部分。下面这个界面让我舒服了很多……
FooBase* base = new FooDerived;
const FooTypeInfo& info = foo::typeinfo(base);
然而,即使接口(interface)不是类的一部分,实现仍然必须使用虚函数,以便它工作:
class FooBase
{
protected:
virtual const FooTypeInfo& typeinfo() const = 0;
friend const FooTypeInfo& ::foo::typeinfo(const FooBase*);
};
namespace foo
{
const FooTypeInfo& typeinfo(const FooBase* ptr) {
return ptr->typeinfo();
}
}
你认为我应该使用第二个接口(interface)(感觉更适合我)并处理稍微复杂的实现,还是应该使用第一个接口(interface)?
@Seth Carnegie
This is a difficult problem if you don't even want derived classes to know about being part of the RTTI ... because you can't really do anything in the
FooBase
constructor that depends on the runtime type of the class being instantiated (for the same reason you can't call virtual methods in a ctor or dtor).
FooBase
是层次结构的公共(public)基础。我还有一个单独的CppFoo<>
减少样板文件数量并使类型定义更容易的类模板。还有一个PythonFoo
使用 Python 派生对象的类。
template<typename FooClass>
class CppFoo : public FooBase
{
private:
const FooTypeInfo& typeinfo() const {
return ::foo::typeinfo<FooClass>();
}
};
class SpecificFoo : public CppFoo<SpecificFoo>
{
// The class can now be implemented agnostic of the
// RTTI system that works behind the scenes.
};
可以在此处找到有关系统工作原理的更多详细信息:
► https://stackoverflow.com/a/8979111/627005
最佳答案
您可以通过 typeid
将动态类型与静态类型关联起来关键字和使用返回 std::type_info
对象作为识别手段。此外,如果您申请 typeid
在专门为此目的创建的单独类(class)上,它对您感兴趣的类(class)完全没有干扰,尽管他们的名字仍然必须提前知道。重要的是 typeid
应用于支持动态多态性的类型 - 它必须有一些 virtual
功能。
例子如下:
#include <typeinfo>
#include <cstdio>
class Base;
class Derived;
template <typename T> class sensor { virtual ~sensor(); };
extern const std::type_info& base = typeid(sensor<Base>);
extern const std::type_info& derived = typeid(sensor<Derived>);
template <const std::type_info* Type> struct type
{
static const char* name;
static void stuff();
};
template <const std::type_info* Type> const char* type<Type>::name = Type->name();
template<> void type<&base>::stuff()
{
std::puts("I know about Base");
}
template<> void type<&derived>::stuff()
{
std::puts("I know about Derived");
}
int main()
{
std::puts(type<&base>::name);
type<&base>::stuff();
std::puts(type<&derived>::name);
type<&derived>::stuff();
}
不用说,因为std::type_info
是适当的对象,并且它们是唯一且有序的,您可以在集合中管理它们,从而删除从接口(interface)查询的类型:
template <typename T> struct sensor {virtual ~sensor() {}};
struct type
{
const std::type_info& info;
template <typename T>
explicit type(sensor<T> t) : info(typeid(t))
{};
};
bool operator<(const type& lh, const type& rh)
{
return lh.info.before(rh.info);
}
int main()
{
std::set<type> t;
t.insert(type(sensor<Base>()));
t.insert(type(sensor<Derived>()));
for (std::set<type>::iterator i = t.begin(); i != t.end(); ++i)
std::puts(i->info.name());
}
当然,您可以根据需要混合搭配两者。
两个限制:
template struct sensor
通过巧妙的元编程,这是一个非常广泛的主题(有时令人费解)。一种可能的变体是添加 RTTI“框架 Hook ”,例如 static const sensor<Myclass> rtti_MyClass;
到类名已知的实现文件,让构造函数完成工作。此时它们还必须是完整类型才能在传感器中进行内省(introspection)。
关于c++ - 什么是处理类的元方面的适当接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8989066/
我对构面有疑问,并根据构面进行了一些过滤。 我知道这是一个重复的问题,但我找不到答案。 我想知道如何在 flex 搜索中实现相同的功能。 假设我有一个有关汽车和某些方面的索引-例如模型和 颜色。 颜色
我正在尝试找到一种解决方案来为某些方面创建子方面列表。 我有一些产品的衣服尺码,它们存储在 solr 中 "Size_both":"W30L30","尺寸宽度":"W30","Size_length"
我正在尝试找到一种解决方案来为某些方面创建子方面列表。 我有一些产品的衣服尺码,它们存储在 solr 中 "Size_both":"W30L30","尺寸宽度":"W30","Size_length"
我对方面有疑问。他们不开火。我有小方面: @Aspect @Component public class SynchronizingAspect { @Pointcut("execution(
这是在 ruby 中启用散列自动生成的巧妙技巧(取自 facets): # File lib/core/facets/hash/autonew.rb, line 19 def self.a
这个问题在这里已经有了答案: 8年前关闭。 Possible Duplicate: Creating a facet_wrap plot with ggplot2 with different ann
XMLHttpRequest 能否从 http://mydomain.example/ 向 http://mydomain.example:81/ 发送请求? 最佳答案 要使两个文档被视为具有相同的来
我对 Elasticsearch 中的方面有一点问题。 我有一个表格视频,一个表格 channel ,一个 channel 有很多视频。 我只想在 X 个最新视频上显示每个 channel 的 %vi
假设我正在为 4 个人绘制数据图表:Alice、Bob、Chuck 和 Dana。我正在使用 ggplot2 制作一个多面图,每个人一个方面。我的磁盘上还有 4 张图像:Alice.png、Bob.p
我已经下载了收件箱,并且正在使用Pig和Hadoop处理电子邮件。我已经使用Pig和Wonderdog在ElasticSearch中为这些电子邮件编制了索引。 现在,我为收件箱中的每个电子邮件地址创建
我有一个模块如下: define([...], function(...){ function anothermethod() {...} function request() {....}
(defprotocol IAnimal "IAnimal" (report [o] (println (type o) " reporting.\n") (inner-repor
我有一个 Bean 需要向 InfluxDB 报告。数据库在表 INFLUX_DB_SERVER 中注册了 InfluxDB。如果你看一下代码,你会发现方法reportMemory做了很多工作,它构造
我的问题与分面有关。在下面的示例代码中,我查看了一些分面散点图,然后尝试在每个分面的基础上叠加信息(在本例中为平均线)。 tl;dr 版本是我的尝试失败了。要么我添加的平均线计算所有数据(不尊重方面变
假设我正在为 4 个人绘制数据图表:Alice、Bob、Chuck 和 Dana。我正在使用 ggplot2 制作一个多面图,每个人一个方面。我的磁盘上还有 4 张图像:Alice.png、Bob.p
尝试用两个方面包装服务类来获取此调用链: javanica..HystrixCommandAspect -> MyCustomAroundAspect -> MyService 遇到两个问题: Hys
我是 AspectJ 的初学者。我用它在我的网络驱动程序中截取屏幕截图。以下是我的包结构。 我想知道如何在 Browser 类中运行我的程序,以便它使用 Screenshots 类中定义的 Aspec
我在使用 spring aop 时遇到问题 (编辑:如果我的方法不是静态的,则代码可以正常工作) 我的包中有这个结构: aaa.bbb.ccc.Clase1.java aaa.bbb.ddd.Clas
我有一个通用存储库类,其中包含各种标记有 PostSharp 方面 (SecuredOperation) 的方法... public class Repository : IRepository, I
我有一个运行多线程的 Hibernate 事务方法“doImportImpl”。而某些记录需要依次导入,所以代码结构大致是这样的: public RecordResult doImportImpl(S
我是一名优秀的程序员,十分优秀!