C++ 从正则表达式构建元组

C++ 从正则表达式构建元组,c++,c++14,C++,C++14,我有一组正则表达式,我必须将它们的捕获组映射到函数参数。在我看来,最简单的方法是从正则表达式捕获组构建一个元组,并使用std::apply。因此,我试图获得一个模板来将正则表达式转换为元组,但我无法让它工作。下面是我所拥有的。我试图专门化递归,但似乎没有办法专门化函数模板。我对模板制作相当陌生,因此欢迎提供任何帮助=) 模板 字符串获取值(标准::smatch和rx){ 返回rx[i]; } 模板 来自接收端的自动元组(std::smatch&rx){ 如果(i>0){ 返回std::tuple

我有一组正则表达式,我必须将它们的捕获组映射到函数参数。在我看来,最简单的方法是从正则表达式捕获组构建一个元组,并使用std::apply。因此,我试图获得一个模板来将正则表达式转换为元组,但我无法让它工作。下面是我所拥有的。我试图专门化递归,但似乎没有办法专门化函数模板。我对模板制作相当陌生,因此欢迎提供任何帮助=)

模板
字符串获取值(标准::smatch和rx){
返回rx[i];
}
模板
来自接收端的自动元组(std::smatch&rx){
如果(i>0){
返回std::tuple_cat(tuple_from_rx(rx),get_value(rx));
}
否则{
返回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>());
}

您可以使用以下选项:

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>());
}
我们可以使用来制作
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);
}
名称空间详细信息{
模板
来自接收端的自动元组(std::index\U序列,std::smatch&rx){
返回std::数组{rx[1+Is]…};
}
}
模板
来自接收端的自动元组(std::smatch&rx){
返回细节::tuple_from_rx(std::make_index_sequence(),rx);
}
我们可以使用来制作一个大小为
的参数包,并将其扩展为一个数组
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);
}
名称空间详细信息{
模板
来自接收端的自动元组(std::index\U序列,std::smatch&rx){
返回std::数组{rx[1+Is]…};
}
}
模板
来自接收端的自动元组(std::smatch&rx){
返回细节::tuple_from_rx(std::make_index_sequence(),rx);
}

这似乎很有趣。是否有数组?如果元组中的每个元素都是相同类型的,则最好将其作为数组使用。;-]match对象的长度是可变的,因为正则表达式在编译时(以其当前形式)无法知道将有多少捕获组。@RichardHodges是的,但是使用这些函数的程序员can@RichardHodges当它被改变时,它将变得相当明显。正则表达式和匹配组的使用之间的关联必须存在于某个地方。抱怨当你改变它时,你必须依靠它来改变事情是虚假的。这似乎很有趣。是否有数组?如果元组中的每个元素都是相同类型的,则最好将其作为数组使用。;-]match对象的长度是可变的,因为正则表达式在编译时(以其当前形式)无法知道将有多少捕获组。@RichardHodges是的,但是使用这些函数的程序员can@RichardHodges当它被改变时,它将变得相当明显。正则表达式和匹配组的使用之间的关联必须存在于某个地方。抱怨当你改变它时,你必须依靠它来改变事情是虚假的(