将具有不同值类型的映射传递给C ++中的函数

时间:2012-03-21 11:11:29

标签: c++ parameter-passing stdmap

我不得不为一些旧的,写得不好的代码添加新功能。有50个不同的列表需要在屏幕上显示和处理,并且它们的当前代码都是剪切和粘贴,只需要对两种不同类型进行微小修改,一个是DAO数据库中的列表,另一个是映射中的列表。

我写了一个Search类,它提供了每个列表类型的功能和帮助类,以提供搜索所需的基本功能。 map helper类只需要访问tstring Key,它不需要differentObject Values。但是,我无法将其编译。

由于各种不同的对象没有关系,我定义了一个基本上为空的类SearchValue,并将它作为所有differentObject类的超类添加到.h中。

举个例子,这是一个地图定义:

typedef map<tstring, MyPatListEntry *, tstringcomp> patlist;

定义了MyPatListEntry:

class MyPatListEntry : public SearchValue {

我将函数定义为:

ListHelper(map<tstring, SearchValue *> *map, CString fieldName) 

编译器(VC ++)给出的错误是ListHelper()的所有定义都不处理所有参数。如果我在编译工作的定义中用MyPatListEntry替换SearchValue,那么基本格式是正确的。

我在网站上环顾四周,发现人们建议用功能模板完成这类事情,我想这样可行,但我很好奇是否有某种原因这样做是不行的。< / p>

感谢您的任何想法。

2 个答案:

答案 0 :(得分:3)

你要求的是在C#世界中被称为协变泛型类型参数(在C ++中不可能),甚至它在你的情况下也不会起作用。原因其实很简单。

想象一下以下代码:

class B {};
class D1 : public B {};
class D2 : public B {};

map<string, D1 *> myMap;
D2 someObject;

void myFunc(map<string, B *> & someMap)
{
    someMap["foo"] = &someObject;
}

由于此问题,您无法以myFunc作为参数调用myMap。您将被允许将someObject类型D2分配到应包含D1的地图中。

答案 1 :(得分:0)

如果您确实需要ListHelper在不同的SearchValue类型上具有不同的行为,则可以将该函数模板化为地图的值类型:

template <class AnySearchValue> ListHelper(map<tstring, AnySearchValue *> *map, CString fieldName) 

如果没有看到更多的实现,很难说这是否可行。 (哎呀抱歉,错过你的OP,你说你考虑过这个)