2017-08-15 66 views
1

我有一組正則表達式,我必須將它們的捕獲組映射到函數參數。在我看來,最簡單的事情是從正則表達式捕獲組構建一個元組,並使用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

這似乎很有趣。你有[MCVE]嗎? – Jonas

+1

其中每個元素是相同類型的元組可能更適合作爲數組。 ; - ] – ildjarn

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

打我吧:( – Caleth

1

我們可以用std::make_index_sequence做出的size_t S,這是我們到一個數組展開參數包。 std::array可用於期待Tuple的地方,因爲它專門爲所有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); 
}