Я видел варианты этого вопроса, но обычно они включают функции, возвращающие один и тот же тип. Вот мой код:Сопоставление строк с функциями с разными типами возврата
#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) получает вызов дважды, потому что моя карта думает, что все ее функции возвращают float.
Есть ли хороший способ сделать это? И это вообще хорошая практика? Я нашел другое решение, но я думаю, что если что-то вроде этого законно, это может быть довольно сексуально.
Рассмотрим: 'струны S = "Int"; checkType (myMap [s]()); 'Вы хотите, чтобы это вызывало' checkType (int) '? Я не вижу, как это может сработать. Какая перегрузка для вызова определяется полностью во время компиляции - она не может измениться во время выполнения в зависимости от значения, которое имеет строковая переменная. –
Eh функция float не должна вызываться дважды. Вы должны получить сбой компиляции. –
@LightnessRacesinOrbit Даже если тип возврата не является частью подписи функции? –