如何将 std::tuple<char, char, char> 转换为 std::string 的 C++ 代码?

4

我正在编写一个轻量级的解析器组合库(类似于 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))}};
  }

但是这并不起作用,因为事实证明无法像这样通过编程方式创建初始化列表。

1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接