繁体   English   中英

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

[英]Converting std::array of std::string to std::tuple of the same size using boost::lexical_cast

我想创建一个接受字符串数组并将其转换为元组的函数,方法是对每个数组元素进行lexical_cast。

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

例如:

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

要么

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

如何在可接受的性能和没有c ++ 14支持的情况下做到这一点?

你可以做

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...>());
}

用法:

std::array<std::string, 2u> ns = {"1", "4.2"};
auto t = Convert<int, double>(ns);

演示版

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

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

这样,还不错:

template <typename... Ts>
std::tuple<Ts...> Convert(const std::array<std::string, sizeof... (Ts)>& arr ) {
    return Convert<Ts...>(arr, make_index_sequence<sizeof...(Ts)>{} );
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM