c++ - 具有特定类型但没有模板的数据结构

标签 c++ templates data-structures

我注意到大多数(全部?)可以存储用户定义类型的 C++ 数据结构都使用模板:

std::vector<T>, std::unordered_map<T....>, etc.

在我看来这是必需的,否则那些数据结构将不得不作为险恶的指针返回 void*用户必须按如下方式手动转换:

std::vector a; 
int b;
a.push_back(b);
static_cast<int>(a.get(0));

可以不使用模板吗?还有其他替代方法吗?

编辑: 许多评论表明,如果没有模板,这是不可能的/不切实际的。 (谢谢!)

如果我限制<T>怎么办?成为一个真正的指针(例如不是 int/float),它仍然不切实际吗?

最佳答案

Is it possible to not use the template?

是的。可以定义一个通用数据结构,允许对<-- 我不知道在这里使用什么动词 任何类型的对象进行分组,而无需使用模板。

有“C 方式”(C 中不存在模板)。 C 方式是使用 void* .你显然已经很熟悉了,但对于答案的其他读者来说,void*是一种特殊的指针类型,可以指向任何类型的对象。当您使用 void*要引用一个对象,您实际上会丢弃该语言提供的所有类型安全性。

我认为标准库中没有任何非模板容器。但是,如果使用提供的模板来实例化 std::vector<void*> 并不过分的话。或类似的,那么你当然可以使用这样的模板实例来存储指向任何对象的指针。

模板优先于 void*因为模板不会将类型安全抛出窗外。模板更容易正确使用。

还没有。但是std::any计划在 C++17 中引入。它可以用来代替 void* .使用 std::any你仍然放弃了编译时类型安全,但至少你保留了运行时安全(当你有错误时你会得到一个异常而不是潜在的龙)。与 void* 不同, std::any管理存储对象的内存。请注意,虽然 std::any不是模板,它的大部分成员函数都是。


Are there any other alternative approaches?

除了模板和void* ?从技术上讲,您还可以使用宏来生成同一程序的不同版本,类似于实例化模板。这有时在 C 中使用。在 C++ 中没有理由这样做,因为模板在各个方面都更好。

关于c++ - 具有特定类型但没有模板的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38483746/

相关文章:

c++ - QTableWidget 右键单击​​事件的问题

c++ - 将文件数据复制到 int 数组中

C++ 委托(delegate)练习

c++ - 乘以可变数量的参数

python - 计算结构有多深的最简单方法?

c++ - 用户定义类的 Bind2nd 问题

c++ - Boost sub_match 抛出 std::length_error 异常

c++ - 如何使用指向泛型模板类的指针来访问依赖于模板参数类型的成员函数

c++ - c或c++中是否有任何头文件来实现图形,树等数据结构?

c# - 是否可以构建一个二叉树并跟踪中位数,仍然使用 O(log(n)) 插入?