問題描述
我的問題在代碼中:
templatestruct TupleOfVectors {std::tuple<std::vector<Ts>...>元組;void do_something_to_each_vec() {//問題:我想這樣做://"for each (N)": do_something_to_vec()//如何?}模板void do_something_to_vec() {auto &vec = std::get(tuple);//對 vec 做一些事情}};
您可以使用一些索引機(jī)制輕松地做到這一點(diǎn).給定一個元函數(shù) gen_seq
用于生成編譯時整數(shù)序列(由 seq
類模板封裝):
命名空間細(xì)節(jié){模板結(jié)構(gòu)序列{};templatestruct gen_seq : gen_seq{ };模板struct gen_seq<0, Is...>: seq<是...>{ };}
以及以下函數(shù)模板:
#include <元組>命名空間細(xì)節(jié){templatevoid for_each(T&& t, F f, seq){auto l = { (f(std::get(t)), 0)... };}}templatevoid for_each_in_tuple(std::tuple<Ts...>const&t, F f){detail::for_each(t, f, detail::gen_seq());}
你可以這樣使用上面的for_each_in_tuple
函數(shù):
#include #include struct my_functor{模板void 運(yùn)算符 () (T&& t){std::cout <<t<<std::endl;}};int main(){std::tuplet(42, 3.14, "Hello World!");for_each_in_tuple(t, my_functor());}
這是一個現(xiàn)場示例.>
在您的具體情況下,您可以這樣使用它:
templatestruct 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{模板void 運(yùn)算符 () (T const &v){//對參數(shù)向量做一些事情...}};};
再一次,這是一個現(xiàn)場示例.
更新
如果您使用的是 C++14 或更高版本,則可以將上面的 seq
和 gen_seq
類替換為 std::integer_sequence
像這樣:
命名空間細(xì)節(jié){template空白for_each(T&&t, F f, std::integer_sequence){auto l = { (f(std::get(t)), 0)... };}}//命名空間細(xì)節(jié)template空白for_each_in_tuple(std::tuple<Ts...>const&t, F f){detail::for_each(t, f, std::make_integer_sequence());}
如果您使用的是 C++17 或更高版本,則可以執(zhí)行此操作(來自 下面的此評論):
std::apply([](auto ...x){std::make_tuple(some_function(x)...);} , the_tuple);
My question is in the code:
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
}
};
You can quite easily do that with some indices machinery. Given a meta-function gen_seq
for generating compile-time integer sequences (encapsulated by the seq
class template):
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...> { };
}
And the following function templates:
#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)>());
}
You can use the for_each_in_tuple
function above this way:
#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());
}
Here is a live example.
In your concrete situation, this is how you could use it:
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)
{
// Do something on the argument vector...
}
};
};
And once again, here is a live example.
Update
If you're using C++14 or later, you can replace the seq
and gen_seq
classes above with std::integer_sequence
like so:
namespace detail
{
template<typename T, typename F, int... Is>
void
for_each(T&& t, F f, std::integer_sequence<int, Is...>)
{
auto l = { (f(std::get<Is>(t)), 0)... };
}
} // namespace detail
template<typename... Ts, typename F>
void
for_each_in_tuple(std::tuple<Ts...> const& t, F f)
{
detail::for_each(t, f, std::make_integer_sequence<int, sizeof...(Ts)>());
}
If you're using C++17 or later you can do this (from this comment below):
std::apply([](auto ...x){std::make_tuple(some_function(x)...);} , the_tuple);
這篇關(guān)于模板元組 - 在每個元素上調(diào)用一個函數(shù)的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!