我有一个我想概括的功能。简单地说,我有一个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;
}
。
任何提示?
{{1}}
答案 0 :(得分:7)
通过功能模板专业化调度到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;
}
答案 1 :(得分:5)
您可以做的一件事是使用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;
});
答案 2 :(得分:3)
使用istream_iterator
:
template <class T>
auto get_vector(std::string s) -> std::vector<T> {
std::vector<T> v;
std::istringstream iss(s);
std::copy(std::istream_iterator<T>(iss), std::istream_iterator<T>(), std::back_inserter(v));
return v;
}