【问题标题】:C++ turn a std::tuple<char, char, char> into a std::string?C++ 将 std::tuple<char, char, char> 变成 std​​::string?
【发布时间】:2021-03-16 21:09:32
【问题描述】:

我正在编写一个轻量级解析器组合库(类似于 Boost::Spirit)作为爱好项目。

我想做的一件事是能够自动将Result&lt;std::tuple&lt;char&gt;&gt;Result&lt;std::tuple&lt;char, char&gt;&gt; 等转换为std::string

同样,如果有例如Result&lt;std::tuple&lt;int, int&gt;&gt; 我希望能够将其转换为 Result&lt;std::vector&lt;int&gt;&gt; 或更一般地用于任何包含零个或多个相同类型元素的元组T 我希望能够将其自动转换为Result&lt;Container&lt;T&gt;&gt;.

如何处理这样的事情?例如,我尝试过:

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

但这不起作用,因为事实证明不可能像这样以编程方式创建初始化列表。

【问题讨论】:

    标签: c++ c++17 template-meta-programming stdtuple conversion-operator


    【解决方案1】:
    template <typename... Ts>
    std::string tuple_to_string(const std::tuple<Ts...>& t)
    {
        return std::apply([](auto... cs)
        { 
            return std::string{cs...}; 
        }, t);
    }
    

    live example on 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}));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      • 2021-05-30
      • 2015-04-28
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多