我已经看过这个问题的变体,但它们通常涉及返回相同类型的函数。这是我的代码:
#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)函数最终被调用两次,因为我的地图认为它的所有函数都返回浮点数。
这样做有好办法吗?这是好的做法吗?我发现了一个不同的解决方案,但我认为如果这样的东西是合法的,它可能会非常性感。
答案 0 :(得分:2)
正如您已经发现的那样,实现它的方式不会起作用,因为存储在map中的函数返回float。
正确的方法是使用类型擦除,但如果使用void *,则必须注意正确的铸造。另一种选择是使用boost::any
或QVariant
。
此示例使用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);
}