使用boost :: lexical_cast将std :: string的std :: array转换为相同大小的std :: tuple

时间:2015-07-20 11:37:26

标签: c++ templates c++11 boost

我想创建一个函数,它接受字符串数组并通过对每个数组元素执行lexical_cast将其转换为元组。

std :: array size与std :: tuple大小相同,所有元组类型在编译时都是已知的

例如:

std::tuple<int, double> Result = Convert({"1", "1.0"});

int A, B;
std::tie(A, B) = Convert({"1", "2"});

如果能获得可接受的性能并且没有c ++ 14支持,我该怎么做呢?

2 个答案:

答案 0 :(得分:2)

你可以做

10001|23|1|"abcd"|4|"A"

使用方法:

namespace detail
{

    template <typename ... Ts, std::size_t N, std::size_t...Is>
    std::tuple<Ts...>
    Convert(const std::array<std::string, N>& s,
            std::index_sequence<Is...>)
    {
        return std::tuple<Ts...>{boost::lexical_cast<Ts>(s[Is])...};
    }

}

template <typename ... Ts, std::size_t N>
std::tuple<Ts...> Convert(const std::array<std::string, N>& s)
{
    static_assert(N == sizeof...(Ts), "Unexpected size");
    return detail::Convert<Ts...>(s, std::index_sequence_for<Ts...>());
}

Demo

答案 1 :(得分:0)

您必须提供要转换的类型。如:

dataArray.push([Date.parse(d), parseInt(obj.in)])

有了它,它并没有那么糟糕:

std::tuple<int, double> Result = Convert<int, double>({"1", "1.0"});

SO上有几个C ++ 11的索引序列技巧实现。