我有一组正则表达式,我必须将他们的捕获组映射到函数参数。在我看来,最简单的方法是从正则表达式捕获组构建一个元组并使用std :: apply。所以我试图获得一个模板将正则表达式转换为元组,但我没有让它工作。以下是我所拥有的。我尝试了专门的递归,但似乎没有办法专门化一个函数模板。我对模板很新,所以欢迎任何帮助=)
template <size_t i>
string get_value(std::smatch& rx) {
return rx[i];
}
template <size_t i>
auto tuple_from_rx(std::smatch& rx) {
if (i > 0) {
return std::tuple_cat(tuple_from_rx<i -1>(rx), get_value<i>(rx));
}
else {
return std::tuple<>();
}
}
答案 0 :(得分:3)
您可以使用以下内容:
template <std::size_t ... Is>
auto as_tuple(const std::smatch& base_match, std::index_sequence<Is...>)
{
return make_tuple(std::string{base_match[1 + Is]}...);
}
template <std::size_t N>
auto as_tuple(const std::smatch& base_match)
{
return as_tuple(base_match, std::make_index_sequence<N>());
}
您的实施问题是tuple_from_rx
会返回不同的类型。你必须使用专业化:
template <size_t i>
auto tuple_from_rx(std::smatch& rx) {
return std::tuple_cat(tuple_from_rx<i -1>(rx), std::make_tuple(get_value<i>(rx)));
}
template <>
auto tuple_from_rx<0u>(std::smatch&) {
return std::tuple<>();
}
答案 1 :(得分:1)
我们可以使用std::make_index_sequence创建size_t
s的参数包,然后将其扩展为数组。 std::array
可用于期待元组的地方,因为它具有所有std::tuple
助手的专业化。
namespace detail {
template <size_t i, size_t ... Is>
auto tuple_from_rx(std::index_sequence<Is...>, std::smatch& rx){
return std::array<std::string, i>{ rx[1 + Is]... };
}
}
template <size_t i>
auto tuple_from_rx(std::smatch& rx) {
return detail::tuple_from_rx<i>(std::make_index_sequence<i>(), rx);
}