Je sais, le C++ ne le permet pas.

Ce code n'est pas valide:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
struct query
{
	long get()
		{ return 5l; }
	std::string get()
		{ return "abc"; }
};
Comment contourner le problème sans passer par un variant géré au runtime.

Voici une solution:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
struct query;
struct my_variant
{
	query & f_q;
	my_variant(query & q) : f_q(q) {}
	template<typename T>
	operator T()
	{
		T t;
		f_q.get(t);
		return t;
	}
};
 
struct query
{
	void get(long & l)
		{ l=5l; }
	void get(std::string & s)
		{ s="abc"; }
	my_variant get()
	{
		return my_variant(*this);
	}
};
 
void main()
{
	query q;
	long i = q.get();
	std::string s = q.get();
}
Si quelqu'un a mieux je suis preneur