
模板元組:在每個元素上呼叫函數
您的目標是在模板元組std:: 的每個元素上呼叫函數元組<:vector>...>。在 TupleOfVectors 結構中,您尋求實作 do_something_to_each_vec 方法,該方法會迭代每個成員向量並對其執行特定函數。
解決方案
採用一些元 -程式設計技術可以優雅地解決這個挑戰。使用生成編譯時序列和伴隨函數模板的元函數gen_seq,您可以實現以下機制:
1 2 3 4 5 6 7 8 9 10 | <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>
|
登入後複製
1 2 3 4 5 6 7 8 9 10 11 12 13 | <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...>& t, F f) {
detail::for_each(t, f, detail::gen_seq<sizeof...(Ts)>());
}</code>
|
登入後複製
您可以利用for_each_in_tuple,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <code class = "cpp" ># include <string>
# include <iostream>
struct my_functor {
template<typename T>
void operator () (T& t) {
std::cout << t << std::endl;
}
};
int main() {
std::tuple<int, double, std::string> t(42, 3.14, "Hello World!" );
for_each_in_tuple(t, my_functor());
}</code>
|
登入後複製
就您而言,您可以如下使用它:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <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) {
}
};
};</code>
|
登入後複製
以上是如何使用元編程將函數應用於向量元組中的每個元素?的詳細內容。更多資訊請關注PHP中文網其他相關文章!