sen*_*iwa 6 c++ templates vector c++11
我有一个功能,我想概括.简单地说,我有一个std::string s我使用解析器生成std::vector<std::string>(它是一个列表"1, 2, 3")的处理,并且该函数应该返回一个std::vector<T>,T限制为double或int.
向量应包含转换后的值.
我坚持使用最后一个参数std::transform,因为它应该在std::stod和之间切换std::stoi.我正在寻找的解决方案是模板元编程魔术,而不是if (std::is_same<T,int>::value).
任何提示?
template <class T>
auto get_vector(std::string s) -> std::vector<T>
{
std::vector<T> v;
auto tmp = split(s);
std::transform(tmp.begin(), tmp.end(), std::back_inserter(v), ??);
return v;
}
Run Code Online (Sandbox Code Playgroud)
调度到std::stoi和std::stod通过功能模板专业化:
template <typename T>
auto parse_number(std::string const& s) -> T;
template <>
auto parse_number<int>(std::string const& s) -> int
{
return std::stoi(s);
}
template <>
auto parse_number<double>(std::string const& s) -> double
{
return std::stod(s);
}
template <class T>
auto get_vector(std::string const& s) -> std::vector<T>
{
std::vector<T> v;
auto tmp = split(s);
std::transform(tmp.begin(), tmp.end(), std::back_inserter(v), &parse_number<T>);
return v;
}
Run Code Online (Sandbox Code Playgroud)
你可以做的一件事是利用a stringstream和lambda并stringstream为你做转换.就像是
std::transform(tmp.begin(), tmp.end(), std::back_inserter(v),
[](const std::string& elem) -> T
{
std::stringstream ss(elem);
T value;
ss >> value;
return value;
});
Run Code Online (Sandbox Code Playgroud)