将字符串映射到具有不同返回类型的函数

时间:2014-10-23 03:30:04

标签: c++ function c++11 map overloading

我已经看过这个问题的变体,但它们通常涉及返回相同类型的函数。这是我的代码:

#include <iostream>
#include <functional>
#include <map>

using namespace std;

void checkType(int x){
    cout << "we got an int: " << x << endl;
}

void checkType(float x){
   cout << "we got a float: " << x << endl;
}

int getInt(){
   return 1;
}

float getFloat(){
   return -101.23f;
}

int main(){
   map<string, function<float()> > myMap({
      {"int", getInt},
      {"float", getFloat}
   });

   checkType(myMap["int"]());
   checkType(myMap["float"]());

   return 1;
}

这里的目标是根据映射函数返回的内容调用重载函数(checkType)的不同版本。显然,checkType(float)函数最终被调用两次,因为我的地图认为它的所有函数都返回浮点数。

这样做有好办法吗?这是好的做法吗?我发现了一个不同的解决方案,但我认为如果这样的东西是合法的,它可能会非常性感。

1 个答案:

答案 0 :(得分:2)

正如您已经发现的那样,实现它的方式不会起作用,因为存储在map中的函数返回float。

正确的方法是使用类型擦除,但如果使用void *,则必须注意正确的铸造。另一种选择是使用boost::anyQVariant

此示例使用const void*来删除类型:

#include <iostream>
#include <functional>
#include <map>

using namespace std;

void callForInt(const void* x){
    const int* realX = static_cast < const int* >( x );
    cout << "we got an int: " << *realX << endl;
}

void callForFloat(const void* x){
    const float* realX = static_cast < const float* >( x );
    cout << "we got a float: " << *realX << endl;
}

int main(){
   map<string, function<void(const void*)> > myMap({
      {"int", callForInt},
      {"float", callForFloat}
   });

   const int v1 = 1;
   const float v2 = -101.23f;

   myMap["int"](&v1);
   myMap["float"](&v2);
}