【问题标题】:C++ Templated STL ContainerC++ 模板化 STL 容器
【发布时间】:2016-05-26 18:22:48
【问题描述】:

我是 C++ 新手,我基本上是想弄清楚我是否可以使用 STL 容器作为模板来存储传递给它的任何类型。我不知道我是否需要使用类模板或定义一个独特的结构或什么。

这基本上是我所拥有的,以及对我想要实现的目标的一些评论:

std::deque<template class T> messages; <--- ???

//the goal being not to store ANY type in this deque, but to somehow
//template it for each type that needs to be stored
//e.g. a different deque for an int, bool, ADT, etc.

template<class T> bool StoreMessage(T const &messageToStore){
     messages<T>.push_back(messageToStore);
}

我什至不知道如何解决这个问题,或者这是否可能,但我真的不想为需要存储的每种类型编写函数,因为有一个 很多。或使用 void*。出于安全考虑,我也不想这样做,我仍然必须明确定义如何处理每种类型,即使过程将完全相同。

谢谢各位!

【问题讨论】:

  • std::deque 已经按照你想要的方式工作了,除非我完全误解了你。
  • 标准 template 库(即no longer the proper name of it)已经为大多数(全部?)容器使用了模板。
  • @Galik 我知道双端队列已经可以存储任何类型,但我不认为双端队列本身是模板化的。目标是有一个双端队列成员变量,它被模板化以存储传递给方法的任何内容。使用 deque 作为成员变量会导致编译器错误,因为 T 不是我的类的类型。
  • 所以你想让一个双端队列保存不同类型的实例?您打算如何将类型拉出来?未来你打算用messages做什么?
  • @Barry 不,抱歉,我不擅长解释。我想在标头中声明一个双端队列,但对传入的每种类型使用不同的双端队列,而不必明确定义我正在使用的类型。例如如果我需要存储整数和浮点数,我可以在不定义 deque 和 deque 的情况下单独存储它们,如果这有意义的话。我认为 Wojciech 将双端队列包装在模板容器中的答案是最好的解决方案。

标签: c++ templates stl polymorphism containers


【解决方案1】:

容器已经被模板化了,所以你想要做的可能是这样的:

template <typename T>
bool store_message(const T &message, std::deque<T> &container) {
    container.push_back(message);
}

要调用它,通过引用传递容器和元素:

std::deque<int> numbers;
int el = 5;

store_message(el, numbers);

【讨论】:

  • 那么我是否必须在使用时为每种数据类型创建一个双端队列? deque 是我现在拥有的非模板类的成员变量。
  • 是的,类型的容器需要在某个地方定义。您可能会找到一种不手动操作的方法。
  • 我在我的 .h 文件中将它定义为 deque,但这不起作用,因为 T 不是我的基类的成员。我想我只是想看看我是否可以对双端队列本身进行模板化,而不是在双端队列中存储任何类型。
  • @dlar 检查 Wojciech Frohmberg 的答案,它解决了您为每种类型定义双端队列的问题,非常聪明
【解决方案2】:

其实你可以这样做:

#include <deque>

template <class T>
struct container {
   static std::deque<T> messages;
};

template <class T>
std::deque<T> container<T>::messages;

template<class T> bool StoreMessage(T const &messageToStore){
     container<T>::messages.push_back(messageToStore);
}

int main() {
   int a = 10;
   StoreMessage(a);
}

所以你想将你的变量包装在额外的模板结构上并将其放入静态变量中。但是,您需要声明静态变量以编译器为该变量分配内存。这是在行中完成的:template &lt;class T&gt; std::deque&lt;T&gt; container&lt;T&gt;::messages;。要正确地做到这一点,请记住将模板化的所有内容移动到头文件中,包括内存分配/声明的内容......这样您就可以访问所有 cpp/cc 文件中的消息。您需要做的就是在其中包含您创建的头文件。

【讨论】:

  • 哇,这似乎工作得很好。我是否能够删除它的静态方面并使双端队列对对象的每个实例都是唯一的?我在派生类存储任何消息类型的基类中使用它,但我不希望将这些相同类型的消息存储在同一个容器中(例如 Y 和 Z 都派生自 X 并且都存储整数,所以我希望 Y 拥有自己的 X::container 和 Z 拥有自己的 X::container) 或者这是不可能的?如果没有,我将不得不使用不同的设计。
  • @dlar 我认为您可以根据消息的类型和相关变量的类型创建一个容器,因此您可以创建像container&lt;int, Y&gt;::message 这样的东西,这将使它成为可能...我认为...
  • 不能告诉你,伙计。你已经非常乐于助人了,我什至没有 15 个代表来影响公众得分。我将研究是否可以修改您的解决方案以使其满足我的需要。再次感谢,伙计!我有点明白我现在在做什么。
  • @dlar 好吧,我想我的答案最近不是很受欢迎,别担心 - 不是你的错 :)
  • 不是反对者,但这个答案的一个问题是它不完全等同于拥有两个不同的成员队列,因为队列是静态的。
猜你喜欢
  • 1970-01-01
  • 2011-06-22
  • 2014-09-10
  • 1970-01-01
  • 2013-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多