队列中的泛型类型

时间:2015-07-20 12:36:43

标签: c++ c++11

我得到一个事件队列,必须包含一个带有泛型变量的类。为了做到这一点,我尝试使用元组。我使用可变参数模板来生成我的元组,但由于它们的类型不同,我无法将它们放入队列中。你能给我一些关于如何做到这一点的建议吗?

#include <type_traits>
#include <iostream>

#include <vector>
#include <iostream>
#include <tuple>
#include <utility>

#include <queue>

class Logs
{
public:
  Logs() {}    

  template <class T, class... Values>
  void write(T data, Values&&... values) {
    auto save = std::tuple_cat(_t, std::make_tuple(data)); // I would like to save the return in a variable class
    write(values...);
  }

  void write() {
    // the end
    // _queue.push(save);
  }
std::tuple& getTuple() { return _t;}
private:
  std::tuple<> _t;
  std::queue<std::tuple<>> _queue;

};


#include <iostream>

int main(int ac, char **av) {
  Logs log;
  Logs log2;

  log.write(4, "42");
  log.write(Logs(), 4.5f, 42, "toto");
  log.write({"hello", "titi"}, 84, "foo");
  // std::cout << std::get<0>(log.getTuple()) << std::endl;
  return 0;
}

可能是_t_queue的类型? 我想推送我的队列一次std::tuple<int, std::string, Log. float, ...>然后std::tuple<std::vector<std::string>, int, long>,等。

1 个答案:

答案 0 :(得分:2)

您可以使用union作为std::queue的类型,如下所示:

#include <iostream>
#include <queue>

typedef union Data {
   int i;
   float f;
   char str[20];
   struct foo {
       int a;
       char c;
   } foo;
   struct bar {
       int a;
       double d;
   } bar;
} data;  

int main () {

  std::queue<data> q;
  data mydata;
  mydata.i = 5;
  q.push(mydata);

  data mydata1;
  mydata1.f = 3.14;
  q.push(mydata1);

  data mydata2;
  strcpy(mydata2.str, "foo");
  q.push(mydata2);

  data mydata3;
  mydata3.foo.a = 1;
  mydata3.foo.c = 'a';
  q.push(mydata3);

  data mydata4;
  mydata4.bar.a = 7;
  mydata4.bar.d = 2.78;
  q.push(mydata4);

  int i = 0;
  while(!q.empty()) {
      if(i == 0) {
        std::cout << ' ' << q.front().i;
      } else if(i == 1) {
        std::cout << ' ' << q.front().f;
      } else if(i == 2) {
        std::cout << ' ' << q.front().str;
      } else if(i == 3) {
        std::cout << ' ' << q.front().foo.a << " " << q.front().foo.c;
      } else if(i == 4) {
        std::cout << ' ' << q.front().bar.a << " " << q.front().bar.d;
      } else {
        std::cout << "I do not know what the item has\n";
      }
      q.pop();
      ++i;
  }

  return 0;
}

但是,请考虑you can not easily use an std::string for example inside a union,或std::tuple,因此您必须重新考虑是否可以为boost::variant提供一个镜头,因为您看到代码正在变为容易不可维护。