次のような表現では、多くのことは得られません。
int x = sto("1");
テンプレートパラメータの目的のタイプを推測する(簡単な)方法はありません。あなたは書く必要があります
int x = sto<int>("1");
これは、一般的な機能を提供する目的をある程度無効にします。一方、
template<typename T>
void sto(std::string x,T& t);
あなたが実現したように、それは役に立つでしょう。C ++ 17にはがありstd::from_chars
、多かれ少なかれそれを正確に実行します(これはテンプレートではなく、オーバーロードのセットであり、文字列ではなく文字へのポインターを受け取りますが、それは細かい部分だけです)。
PS
上記の式で目的の型を推測する簡単な方法はありませんが、方法はあります。私はあなたの質問の核心があなたが求めた署名であったとは思いません、そして以下はそれを実装する良い方法だとは思いませんが、上記をint x = sto("1");
コンパイルする方法があることを知り、それを知りたくて興味がありました動作中。
#include <iostream>
#include <string>
struct converter {
const std::string& x;
template <typename T> operator T() { return 0;}
};
template <> converter::operator int() { return stoi(x); }
template <> converter::operator double() { return stod(x); }
converter sto(const std::string& x) { return {x}; }
int main() {
std::string s{"1.23"};
int x = sto(s);
double y = sto(s);
std::cout << x << " " << y;
}
これは意図したとおりに機能しますが、重大な欠点があります。おそらく最も重要なことに、を書くauto x = sto(s);
ことができます。つまり、間違って使用するのは簡単です。