1
1
你考虑过使用boost::bind和boost::函数的组合吗?在这两个实用工具之间,您可以轻松地将任何C++调用的函数对象封装起来,并将它们轻松地存储在容器中,并且通常希望所有这些都能“正常工作”。作为一个例子,下面的代码示例的工作方式完全符合您的预期。
|
2
0
看起来你在寻找反射或委托之类的东西——我不太确定你想要完成什么,但最好的方法似乎是有一个函数指针的映射:
只要知道映射不会改变,就可以通过将迭代器返回给客户机来实现类似于整数的某种形式的优化。 如果您正在寻找像C语言或动态语言(如PHP)中所允许的“动态绑定”,很不幸的是,您无法做到这一点——在编译代码时,C++会破坏类型信息。 希望能有帮助! |
3
0
您可能需要稍微修改这个问题,因为静态和动态绑定实际上在C++中有特定的含义。 例如,参数的默认值是在编译时确定的,因此如果基类中有一个虚方法声明其参数的默认值,那么这些值是在编译时设置的。 在运行时将忽略在派生类中声明的这些参数的任何新默认值,其结果是将使用基类中的默认参数值,即使在派生类中调用了成员函数。 默认参数值被称为静态绑定。 斯科特·迈耶斯在他那本好书中的一个项目中讨论了这个问题。” Effective C++ “。 高温高压 |
4
0
Qt4 有一个很好的动态绑定系统,可以通过他们的“元对象编译器”(MOC)实现。上面写着他们的 Qt Object Model page . |
5
0
下面是一种在Linux上从共享库动态加载类的方法 http://www.linuxjournal.com/article/3687?page=0,0 还有一个stackoverflow问题 C++ Dynamic Shared Library on Linux 在windows中也可以通过从dll动态加载c函数,然后再加载这些函数来实现。 在获得动态加载解决方案之后,映射部分就变得微不足道了 真正的好书James O. Coplien的C++编程习语和成语有一个关于增量加载的章节 |
6
0
这是我实际方法的一个例子。它只是工作(c)但我很确定一个更干净和更好的方式存在。它按原样用g++4.4.2编译和运行。删除构造函数中的指令会很好,但我找不到实现这一点的方法。Dispatcher类基本上是一个可调度的方法表,每个实例的表上都必须有一个指针。 注意:此代码将隐式地使所有分派的方法成为虚拟的。
这是程序输出
编辑(4月28日): 答案是 this related question 很有启发性。使用带有内部静态变量的虚拟方法比使用需要在构造函数中初始化的成员指针变量更可取。 |
7
0
我看过你的例子和对另一个问题的回答。但如果你谈到m_u dispatcher成员,情况就大不相同了。 对于最初的问题,没有办法遍历类的方法。只能使用宏删除add(“method”,t::method)中的重复:
其中,“”将把methodname转换为类似required的字符串(根据需要展开宏)。对于类似命名的方法,这将删除潜在的输入错误源,因此这是非常理想的。 唯一的方法来列出方法名称IMHO是通过解析“NM”(Linux上,甚至在Windows上通过BINUTILS端口)在这样的文件(你可以要求它解散C++符号)的输出。如果要支持此功能,则可能需要在单独的源文件中定义initdispatcher以自动生成。没有比这更好的方法了,是的,这可能是丑陋或完美的取决于你的限制。顺便说一句,它还允许检查作者没有重载方法。不过,我不知道是否可以过滤公共方法。 我在回答关于a和b的构造器中的行的问题。我认为这个问题可以用奇怪的重复模板模式来解决,应用于dispatchable:
免责声明:我无法测试编译这个(我远离编译器)。您可能需要转发声明调度器,但是由于它得到模板参数,所以我认为依赖参数的查找使得不必要的(我不足够的C++ Guru来确保这一点)。 为了方便起见,我添加了一个dispatcher()方法,如果其他地方需要的话(否则可以在dispatch()中内联它)。 crtp在这里如此简单,在另一个线程中如此复杂的原因是您的成员在这里不是静态的。我首先想到让它成为静态的,然后我认为没有理由保存对singleton()的调用结果并浪费内存,然后我查找它并找到这个解决方案。我怀疑dispatcher()中的额外引用是否节省了任何额外的时间。 在任何情况下,如果需要m_dispatcher成员,可以在dispatcheble()构造函数中初始化它。
关于您的示例,由于initDispatcher()是一个模板方法,所以我坦率地怀疑是否有必要读取method1和method2。
|
8
0
顺便说一句-不要忘记,从vtable调度的虚拟函数的数字位置与所有编译器在对应的头文件中出现的顺序一致。你也许可以利用这一点。这是微软COM技术的核心原则。 另外,你可以考虑马克·德洛拉在《游戏编程宝石》(第一卷)中发表的一种方法。这篇文章的标题是 "generic function binding interface “用于函数的rpc/网络绑定。可能正是你想要的。 |
9
0
|
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
rainer · 后台插入程序的初始化 1 年前 |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |