2015-07-20 53 views
0

我想创建一个函数,它接受一串字符串并通过在每个数组上执行lexical_cast将其转换为元组元素。将std :: string的std :: string数组转换为使用boost的相同大小的std :: tuple :: lexical_cast

的std ::数组大小相同的std ::元组大小和所有的元组类型在编译时

已知例如:

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

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

如何我可以用可接受的性能和没有C++ 14支持来做到吗?

+0

问题是什么?你已经指定了你想要做的事情。实现必要的流媒体操作。此外,我没有看到问题中的std ::数组 – sehe

回答

2

你可以做

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); 

Demo

0

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

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的实现。

相关问题