我有一个模板化的自定义容器类:
template<typename T>
class MyContainer {
T Get();
void Put(T data);
};
我想将指向此容器的指针传递给一个函数,该函数将作为通用数据访问容器的数据 - 即 char*
或 void*
。想想序列化。此函数有些复杂,因此由于模板原因,最好不要在 header 中指定它。
// Errors of course, no template argument
void DoSomething(MyContainer *container);
我同意要求用户提供 lambda 或子类或执行转换的东西。但我似乎无法想出一个干净的方法来做到这一点。
我考虑通过让 MyContainer
包含一些抽象 MyData
类的容器来完全避免模板,该类具有 virtual void Serialize(void *dest) = 0;
功能。用户会将 MyData
子类化以提供他们的类型和序列化,但这似乎变得相当复杂。同样效率低下,因为它需要存储指向 MyData
的指针以避免对象切片,并且 MyData
通常非常小并且容器将容纳大量数据(大量指针存储和取消引用)。
最佳答案
你不需要任何 char*
或 void*
或继承。
考虑这个简化的实现:
template <class T>
void Serialize (std::ostream& os, const MyContainer<T>& ct) {
os << ct.Get();
}
突然这适用于任何 T
有合适的operator<<
过载。
没有合适 operator<<
的用户类型怎么办?重载?只需告诉用户提供一个即可。
当然你可以使用任何重载函数。它不必命名为 operator<<
.您只需要将它的名称和签名传达给用户,并让他们重载它。
关于c++ - 如何为模板化类型提供 void* 访问器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55989944/