我的C++框架有Buttons.Button来自Control.因此,接受Control的函数可以将Button作为其参数.到现在为止还挺好.
我也有List <
T>.但是,List <
Button>不是从List <
Control> 派生的,这意味着接受Controls列表的函数不能将Buttons列表作为其参数.这很不幸.
也许这是一个愚蠢的问题,但我不知道如何解决这个问题:(列表<
按钮>
应该来自List <
Control >
,但我没有看到一种方法来"自动"实现这一点.
Stroustrup在他的FAQ中有一个项目:
为什么我不能指定vector
一个vector
您可以通过两种方式解决它:
使列表包含指向Control
.然后接受List
使您的功能成为模板.您仍然可以使用List
和List
再,但它更多的样板代码,而不是necassary的大部分时间.
这是第二种替代方案的代码.第一种选择已经由其他答案解释:
class MyWindow { templatevoid doSomething(List & l) { // do something with the list... if(boost::is_same ::value) { // special casing Control } else if(boost::is_same
要doSomething
仅限制List
,需要更多代码(enable_if
如果您想知道,请查找).
请注意,这种代码(看你有什么类型)是要避免的.你应该用虚函数来处理这些事情.doSomething
向Control 添加一个函数,并在Button中覆盖它.
使用指针怎么样?只需要一个列表,list
并将您喜欢的任何Control派生对象放入其中.
我不想告诉你,但是如果你使用Control实例列表而不是指向Control的指针,你的按钮无论如何都会是垃圾(Google"对象切片").如果他们是指针列表,然后要么使list
成list
如其他人所说,或者做一个拷贝到一个新的list
从list
并通过该入函数.或者将该功能重写为模板.
因此,如果您之前有一个名为doSomething的函数,它将控件列表作为参数,那么您将其重写为:
templatevoid doSomething( const std::list & myControls ) { ... whatever the function is currently doing ... } void doSomethingElse() { std::list