Вот еще одна интерпретация, которая не использует шаблоны:
struct some_data
{
int i;
char c;
std::string s;
void get(int& value) const
{ value = i; }
void get(char& value) const
{ value = c; }
void get(& value) const
{ value = s; }
};
// ...
some_data received_data;
int k;
received_data.get(k);
//...
received_data.s = "Hello";
std::string world;
received_data.get(world);
std::cout << world << std::endl;
Компилятор будет генерировать правильные вызовы методов в зависимости от типа аргумента.
Это может быть переведено в функции, не являющиеся членами:
void Get_Some_Data(char& value, const some_data& sd)
{
value = sd.c;
return;
}
void Get_Some_Data(int& value, const some_data& sd)
{
value = sd.i;
return;
}
void Get_Some_Data(std::string& value, const some_data& sd)
{
value = sd.s;
return;
}
//...
char f;
Get_Some_Data(f, received_data);