我注意到大多数(全部?)可以存储用户定义类型的 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/