矢量双打/英特尔模板功能

时间:2017-02-03 16:36:07

标签: c++ c++11 templates vector

我有一个我想概括的功能。简单地说,我有一个std::vector<std::string>,我使用生成"1, 2, 3"的解析器进行处理(它是std::vector<T>中的列表),该函数应返回Tdouble仅限intstd::transform

矢量应包含转换后的值。

我坚持使用std::stod的最后一个参数,因为它应该在std::stoiif (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}}

3 个答案:

答案 0 :(得分:7)

通过功能模板专业化调度到std::stoistd::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)

您可以做的一件事是使用stringstreamlambda并让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;
}