从正则表达式构建元组

时间:2017-08-15 07:57:48

标签: c++ c++14

我有一组正则表达式,我必须将他们的捕获组映射到函数参数。在我看来,最简单的方法是从正则表达式捕获组构建一个元组并使用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<>();
    }
}

2 个答案:

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