Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以在运行时重载函数?_C++_Overloading - Fatal编程技术网

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(我打赌
标志
在父函数的生命周期内是常量)。它足够短并且有正确的意图。