久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

模板元組 - 在每個元素上調(diào)用一個函數(shù)

Template tuple - calling a function on each element(模板元組 - 在每個元素上調(diào)用一個函數(shù))
本文介紹了模板元組 - 在每個元素上調(diào)用一個函數(shù)的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!

問題描述

限時送ChatGPT賬號..

我的問題在代碼中:

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 或更高版本,則可以將上面的 seqgen_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)!

【網(wǎng)站聲明】本站部分內(nèi)容來源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

Difference between std::reference_wrapper and simple pointer?(std::reference_wrapper 和簡單指針的區(qū)別?)
Difference between const. pointer and reference?(常量之間的區(qū)別.指針和引用?)
How to access the contents of a vector from a pointer to the vector in C++?(c++ - 如何從指向向量的指針訪問向量的內(nèi)容?)
Meaning of *amp; and **amp; in C++(*amp; 的含義和**amp;在 C++ 中)
Why can#39;t I do polymorphism with normal variables?(為什么我不能對普通變量進(jìn)行多態(tài)?)
Dereferencing deleted pointers always result in an Access Violation?(取消引用已刪除的指針總是會導(dǎo)致訪問沖突?)
主站蜘蛛池模板: 亚洲午夜网 | 亚洲一二三区av | 国产一级特黄真人毛片 | 久久99精品久久久 | 日韩色图在线观看 | 国产在线一区观看 | 国产一在线观看 | 一区二区在线免费播放 | 一区二区三区视频 | h免费观看| 免费在线h视频 | 免费黄色录像片 | 五月婷婷色 | 罗宾被扒开腿做同人网站 | 亚洲午夜精品一区二区三区他趣 | 国产高清精品一区二区三区 | 6996成人影院网在线播放 | 视频在线亚洲 | 夜夜爽99久久国产综合精品女不卡 | 国产精品一区免费 | 在线观看www | 欧美精品在线一区 | 国产成人免费视频网站高清观看视频 | 亚洲精品国产综合区久久久久久久 | 午夜视频免费在线观看 | 国产精品综合 | 毛片av免费看 | av福利网 | 视频一二区 | 91精品国产色综合久久 | 成人a在线 | 97视频免费 | 日本在线一区二区三区 | 久久99精品久久久 | 日本一区二区三区免费观看 | 亚洲国产精品久久久久婷婷老年 | 黄色毛片网站在线观看 | 国产精品久久久久久久久久免费看 | 成人午夜在线 | 精品国产青草久久久久福利 | 春色av|