您不会获得太多收益,因为在类似
int x = sto("1");
没有(简便)的方法来推断模板参数的所需类型。你将不得不写
int x = sto<int>("1");
这在某种程度上破坏了提供通用功能的目的。另一方面,
template<typename T>
void sto(std::string x,T& t);
如您所知,将很有用。在C ++ 17中std::from_chars
,它或多或少地做到了这一点(它不是模板,而是一组重载,它使用指向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);
,即很容易使用错误。