C++ 是否可以在运行时重载函数?
我想简化一段代码,其中包含大约一百个表达式,如下所示:C++ 是否可以在运行时重载函数?,c++,overloading,C++,Overloading,我想简化一段代码,其中包含大约一百个表达式,如下所示: if( flag ) AddData( key, some_number ); else AddData( key, error_description ); AddData( key, flag? some_number : error_description ); 其中AddData重载为 bool AddData( int key, double value ); bool AddData( int key, co
if( flag )
AddData( key, some_number );
else
AddData( key, error_description );
AddData( key, flag? some_number : error_description );
其中AddData重载为
bool AddData( int key, double value );
bool AddData( int key, const char * error );
我想这样表达上面的代码:
if( flag )
AddData( key, some_number );
else
AddData( key, error_description );
AddData( key, flag? some_number : error_description );
当然,它不会编译,因为标志的值是在运行时确定的,而AddData签名需要在编译时确定
将这两个函数组合成
bool AddData( int key, bool flag, double value, const char * error );
解决哪些参数需要使用,哪些参数需要忽略,这些都是可行的,但看起来还不够漂亮
因此,问题是:是否有可能以更合理的方式解决运行时的函数重载 假设所讨论的表达式中没有一个符号可以被分解,那么最好的结果就是
AddData(key, flag, some_number, error_description)
如果您可以将其分解为可能标志
应用于多个调用,那么您就可以开始使用类似
Adder<flag>{}
.AddData(key1, val1, error1)
.AddData(key2, val2, error2)
.AddData(...)
.
.
加法器{}
.AddData(键1、值1、错误1)
.AddData(键2、值2、错误2)
.AddData(…)
.
.
也就是说,一个“流畅”的界面,如果每次都使用
,它会记住的哪一侧。只需在函数中定义一个小助手,然后使用它:
auto AddHelper = [](bool flag, int key, double value, const char* error) {
return flag ? AddData(key, value) : AddData(key, error);
}
如果标志实际上始终相同,则这是一个简单的更改:
auto AddHelper = [flag](int key, double value, const char* error) {
return flag ? AddData(key, value) : AddData(key, error);
}
依赖编译器进行优化。您最好使用多态性而不是数百个ifs
您可以选择一个多态基类来进行数据添加,而不是更改标志,而是选择正确的派生类
调用代码将是:
data_adder->add(key, value, error_description);
基类和派生类示例:
struct DataAdder {
virtual void add(int key, double value, const char *error) = 0;
protected:
~DataAdder(){};
};
struct ValueDataAdder : DataAdder {
void add(int key, double value, const char*) override { AddData(key, value); }
};
struct ErrorDataAdder : DataAdder {
void add(int key, double, const char* error) override { AddData(key, error); }
};
AddData(键、标志?某些编号:错误描述)代码>看起来类似于添加数据(键、标志、一些编号、错误描述)代码>…仅对someNumber
/errorDescription
中的一个进行评估是否重要?另外,每个调用的标志表达式是否不同?可以使用函数指针。根据输入,取消引用相应的函数指针。另外,数据编译时是否有常数?键
s是否连续使用?@重复数据消除器:没有一个变量是运行时常量。第二个咒语+1(我打赌标志
在父函数的生命周期内是常量)。它足够短并且有正确的意图。