我得到一个事件队列,必须包含一个带有泛型变量的类。为了做到这一点,我尝试使用元组。我使用可变参数模板来生成我的元组,但由于它们的类型不同,我无法将它们放入队列中。你能给我一些关于如何做到这一点的建议吗?
#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>,
等。
答案 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提供一个镜头,因为您看到代码正在变为容易不可维护。