2015-07-20 38 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的實現。

相關問題