我有一个架构,其中几乎所有内容都是一个插件。该体系结构是图形用户界面的基础,其中每个插件都由“表面”(即用户可以通过其与插件进行交互的UI控件)表示。这些表面也是插件。每当添加新插件时,瘦主机都会自动确定哪个可用表面最适合它。这个问题的主题是如何在C++中实现动态类型匹配。
如您所见,目前,该体系结构是使用C#实现的,很大程度上依赖于反射。但是,我现在正在为C++重新设计整个过程,但是由于C++没有反射(并且由于我是C++的新手),我需要一些有关如何最好地复制没有此功能的信息。
这是目前在C#(简化和伪)中的处理方式:
所有插件都是Plugin类的后代。
每种表面类型均带有“目标插件类型”标记,指示其设计用于的最具体/最深的后代。
最通用的表面是仅处理插件级别的表面(例如,仅显示名称标签)。这样可以确保所有插件至少具有一个可以在屏幕上表示它们的表面,即使它没有提供任何有用的交互方式。
我们将其称为PluginSurface的“基准”表面类型。如果-为了简洁起见(实际上是通过Class Attributes完成的)-我们在表面上使用了一个属性来指示其目标类型,
PluginSurface.TargetType = typeof(Plugin)
Father : Plugin
Mother : Plugin
Daughter : Father
Son1 : Mother
Son2 : Mother
Grandson : Son1
PluginSurface表示。因此,我们创建了更多表面来更具体地处理新插件的功能(所有表面均来自PluginSurface):MotherSurface.TargetType = typeof(Mother)
GrandsonSurface.TargetType = typeof(Grandson)
Father -> PluginSurface
Daughter -> PluginSurface
Mother -> MotherSurface
Son1 -> MotherSurface
Son2 -> MotherSurface
Grandson -> GrandsonSurface
PluginSurface GetBestFitSurface(Type pluginType)
TargetType检查其pluginType属性。更具体地说,它检查TargetType是否IsAssignableFrom插件类型。它创建所有正匹配的列表。GrandsonSurface是专门设计用来表示GrandSon的,因此它将是该插件的完整UI。但是Son1和Son2是“仅”获得MotherSurface的,因此,它们与Mother不共有的任何功能都不会包含在其UI表示中(直到建立了更专业的Son接口(interface),这时才是最好的)适合等)。请注意,这是预期的用途-通常,Mother插件将是抽象的,而针对它的接口(interface)实际上将是Son接口(interface),用于包装Mother的所有子级。因此,单个表面为整个类相似功能的插件提供了UI。Type.IsAssignableFrom(Type)的C++类似物,其中两种类型都被动态赋予。.我正在寻找dynamic_cast和typeid的方向,但是到目前为止,我还没有对如何做有一个牢牢的了解。它。有关体系结构,模式或实现细节的任何技巧将不胜感激。最佳答案
一种选择是在您的Plugin基类中具有一个功能:
virtual std::string id() const { return "Plugin"; }
override std::string id() const { return "Grandson " + Mother::id(); }
id()时,您会得到类似“孙子母亲插件”的信息。您可以将它扔给std::stringstream ss(id);,给我们一个while (ss >> plugin_id),然后在表面容器中寻找使用plugin_id作为键...。typeid或dynamic_cast的方法,因为typeid不会告诉您基类(*),而且dynamic_cast必须知道在编译时要测试的类型。我假设您希望能够使用新的插件,并在不编辑代码的情况下更改id-> surface映射的某些文件或其他配置。typeinfo的方法。
关于c++ - C++中插件的“Best fit”动态类型匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20988296/
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
如何匹配未被反斜杠转义的平衡定界符对(其本身未被反斜杠转义)(无需考虑嵌套)?例如对于反引号,我试过了,但是转义的反引号没有像转义那样工作。regex=/(?!$1:"how\\"#expected"how\\`are"上面的正则表达式不考虑由反斜杠转义并位于反引号前面的反斜杠,但我愿意考虑。StackOverflow如何做到这一点?这样做的目的并不复杂。我有文档文本,其中包括内联代码的反引号,就像StackOverflow一样,我想在HTML文件中显示它,内联代码用一些spanMaterial装饰。不会有嵌套,但转义反引号或转义反斜杠可能出现在任何地方。
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s