使用函數迭代元組元素
在C 中,我們經常遇到涉及對元組的每個元素進行操作的程式碼。以下程式碼片段突出顯示了我們想要自訂此過程的場景:
<code class="cpp">template<typename... Ts> struct TupleOfVectors { std::tuple<std::vector<Ts>...> tuple; void do_something_to_each_vec() { // Question: I want to do this: // "for each (N)": do_something_to_vec<N>() // How? } template<size_t N> void do_something_to_vec() { auto &vec = std::get<N>(tuple); // do something to vec } };</code>
目標是迭代元組的元素並對每個元素應用特定的函數。這種模式在處理具有可變長度向量的資料結構時經常遇到。
擁抱模板元編程
為了實現此功能,我們可以利用模板元編程,特別是' for_each' 模式。這種方法依賴於生成編譯時整數序列來充當元組元素的索引。
<code class="cpp">namespace detail { template<int... Is> struct seq { }; template<int N, int... Is> struct gen_seq : gen_seq<N - 1, N - 1, Is...> { }; template<int... Is> struct gen_seq<0, Is...> : seq<Is...> { }; }</code>
應用函子模式
接下來,我們介紹函數模板迭代元組元素:
<code class="cpp">#include <tuple> namespace detail { template<typename T, typename F, int... Is> void for_each(T& t, F f, seq<Is...>) { auto l = { (f(std::get<Is>(t)), 0)... }; } } template<typename... Ts, typename F> void for_each_in_tuple(std::tuple<Ts...> const& t, F f) { detail::for_each(t, f, detail::gen_seq<sizeof...(Ts)>()); }</code>
定義向量元組
最後,我們將此「for_each_in_tuple」機制整合到「TupleOfVectors」結構中:
<code class="cpp">template<typename... Ts> struct TupleOfVectors { std::tuple<std::vector<Ts>...> t; void do_something_to_each_vec() { for_each_in_tuple(t, tuple_vector_functor()); } struct tuple_vector_functor { template<typename T> void operator()(T const &v) { // Perform custom action on the vector } }; };</code>
該解決方案提供了一種高效靈活的方式來操作元組的每個元素,使其成為C 語言中複雜資料處理任務的強大工具。
以上是如何使用模板元編程來迭代元組元素並對 C 中的每個元素應用特定函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!