"Overload" a function by return type:
https://godbolt.org/z/jYfK1W68j
#include <iostream>
class Caster {
const char* str;
public:
Caster(const char* str) : str{str} {}
template <class T>
operator T() const {
std::cout << "Not implemented: ";
return {};
}
operator int() const {
std::cout << "int: ";
return std::stoi(str);
}
operator double() const {
std::cout << "double: ";
return std::stod(str);
}
operator std::string() const {
std::cout << "std::string: ";
return str;
}
};
auto f(const char* str) {
return Caster{str};
}
#include <iostream>
int main() {
int i = f("34");
std::cout << i << '\n';
double d = f("2.3");
std::cout << d << '\n';
std::string s = f("text");
std::cout << s << '\n';
bool b = f("true");
std::cout << b << '\n';
}