簡體   English   中英

C++ 轉一個 std::tuple<char, char, char> 進入 std::string?</char,>

[英]C++ turn a std::tuple<char, char, char> into a std::string?

我正在編寫一個輕量級解析器組合庫(類似於 Boost::Spirit)作為愛好項目。

我想做的一件事是能夠自動將Result<std::tuple<char>>Result<std::tuple<char, char>>等轉換為std::string

同樣,如果有例如Result<std::tuple<int, int>>我希望能夠將其轉換為Result<std::vector<int>>或更一般地用於包含零或的任何元組更多相同類型的元素T我希望能夠將其自動轉換為Result<Container<T>>

如何處理這樣的事情? 例如,我嘗試過:

  template<typename Container>
  Result<decltype(std::make_from_tuple<Container>(std::declval<T>()))> () const {
      Result{Container{std::make_from_tuple<std::initializer_list<typename std::tuple_element<0, T>::type>> (std::get<T>(*this))}};
  }

但這不起作用,因為事實證明不可能像這樣以編程方式創建初始化列表。

template <typename... Ts>
std::string tuple_to_string(const std::tuple<Ts...>& t)
{
    return std::apply([](auto... cs)
    { 
        return std::string{cs...}; 
    }, t);
}

godbolt.org 上的實時示例


更通用的解決方案:

template <typename T, typename... Ts>
T tuple_to_container(const std::tuple<Ts...>& t)
{
    return std::apply([](auto... cs){ return T{cs...}; }, t);
}

用法:

std::tuple test0{'a', 'b', 'c'};
std::tuple test1{'a', 'b', 'c', 'd', 'e', 'f'};

std::cout << tuple_to_container<std::string>(test0) << '\n'
          << tuple_to_container<std::string>(test1) << '\n';

std::tuple test2{0, 1, 2, 3};
auto converted = tuple_to_container<std::vector<int>>(test2);
assert(converted == (std::vector{0, 1, 2, 3}));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM