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

sen*_*iwa 6 c++ templates vector c++11

我有一个功能,我想概括.简单地说,我有一个std::string s我使用解析器生成std::vector<std::string>(它是一个列表"1, 2, 3")的处理,并且该函数应该返回一个std::vector<T>,T限制为doubleint.

向量应包含转换后的值.

我坚持使用最后一个参数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)

yur*_*hek 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;
}
Run Code Online (Sandbox Code Playgroud)


Nat*_*ica 5

你可以做的一件事是利用a stringstreamlambdastringstream为你做转换.就像是

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)

  • 只有在数据量非常小的情况下才这样做,所以你不在乎它是否非常慢. (4认同)