0

我有许多引用typedef'd 数据类型的函数,如下所示:

typedef std::map<string, string> dict;

union ret_t{
    int i;
    long l;
    double d;
};

ret_t func1(char* bytes, dict &d){
    //blah blah
}
ret_t func2(char* bytes, dict &d){
    //blah blah 2
}

我还有一个处理函数的映射,使用boost::function如下定义:

std::map <int, boost::function< ret_t (char*, dict) > > handlers;

我定义了这一点,以便使用我正在使用的 >100 个处理函数,我可以简单地读取一个键并调用handlers[key](bytes, d);并让我的函数执行,我的不同数据类型只需要 3 个 if/else(知道我需要的数据类型是另一个我不会涉及的问题。它与问题无关)。这按预期工作。

我的问题是少数函数不使用字典,并且在处理程序之外的上下文中很有用(例如,准备字节流并将其转换为 long int 的函数)。为了从我没有预定义字典的上下文中调用此函数,我要么必须创建一个从未使用过的无用字典:

dict d;
func1(bytes, d);

或者我必须 pverride 函数:

//previous definition

ret_t func1(char* bytes){
    //same blah blah as before
}

当我尝试使用默认参数(例如NULL空字典)定义它时,出现编译器错误:

default argument for 'dict& d' has type 'dict {aka std::map<std::basic_string<char>, std::basic_string<char> >}'

有没有办法做我想做的事,而不必完全重写我的代码来传递指针而不是引用?

4

1 回答 1

0

对于那些不需要字典的函数,创建两个版本。有一个不将字典作为参数,而另一个只是在没有字典的情况下调用另一个。将前者用于所有直接调用,而将后者用于像其他使用字典的函数一样进行调度。

于 2012-12-31T20:12:09.153 回答