Ça ne vaut pas le coup. La modélisation du type de retour signifie que vous devez spécifier explicitement le paramètre du modèle lorsque vous l'appelez. Quelque chose comme ça, j'ai peut-être la mauvaise syntaxe:
int i = obj.operator[]<int>("IntVal");
C++ ne déduit pas les paramètres de modèle de ce que vous attribuez le résultat de l'appel, uniquement à partir des paramètres que vous appelez la fonction avec.
Alors vous pourriez aussi bien définir simplement une fonction normale:
int i = obj.get<int>("IntVal");
Ou dans ce cas, que ce soit faire ou mettre en œuvre get
en utilisant ceci:
int i = boost:lexical_cast<int>(obj["IntVal"]);
Comme le dit Amit, vous pouvez définir operator[]
pour renvoyer un type qui peut être converti en int
ou en d'autres types. Ensuite, votre code d'exemple peut être fait pour compiler sans lexical_cast explicite.
Les fonctions surchargées ne peuvent différer que par le type de retour. Donc ce ne serait pas simple, je pense. –
Pour ce que ça vaut, j'ai déjà fait quelque chose comme ça et fini avec une syntaxe comme 'int i = obj [" IntVal "]. Comme()'. Ou peut-être 'int i = obj.get (" IntVal ")'. Vous pourriez utiliser des conversions implicites pour obtenir la syntaxe que vous souhaitez, mais cela ouvrira d'autres mondes de douleur. –
Une autre suggestion pour une syntaxe (que j'ai utilisée auparavant et qui est aussi utilisée dans pqxx) est de retourner la valeur en paramètre et de permettre au compilateur de faire type deduction: 'obj [clé] .to (var)'. Cela supprime le besoin du type explicite dans l'appel de la méthode. –