c++ - 从正则表达式构建元组

标签 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<>();
    }
}

最佳答案

您可以使用以下内容:

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

关于c++ - 从正则表达式构建元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45688664/

相关文章:

c++ - 为什么在 C++ 中需要两个范围 for 循环来更改 vector 的这些元素?

c++ - 当结构具有默认构造函数时,为什么我的 C++ 程序在 Release模式下崩溃?

c++ - 将std::shared_ptr <T>传递给采用std::shared_ptr <const T>的函数?

c++ - 枚举映射对重构具有鲁棒性

c++ - 为什么我得到 "declaration is incompatible with (x)"?

c++ - vector 元组并向后推

c++ - 引用折叠和 const

c++ - Thrift 或 Protocol buffer 作为跨语言序列化解决方案?

c++ - 在 C++ 中处理 fscanf 等效项的更好方法

c++ - 如何将两个字节 * (secblock) 与运算符 'secblock<T, A>::operator+=' 连接起来