C++ 将 std::tuple<char, char, char> 变成 std::string?
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);
}
更通用的解决方案:
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}));
我正在编写一个轻量级解析器组合器库(类似于 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);
}
更通用的解决方案:
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}));