c++ - 如何为模板化类型提供 void* 访问器?

标签 c++ c++11 templates

我有一个模板化的自定义容器类:

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/

相关文章:

c++ - C 中是否有相当于 %* 或 Environment.CommandLine 的东西?

c++ - 由模板成员函数引起的错误 C2275。这段代码有错吗?

c++ - 需要使用 linux ubuntu 从 .cpp 查找上次启动的时间?

c++ - 具有 get 函数的模板类总是返回引用,

Java项目-Velocity不替换某些字符串

c++ - Qt XML 读取元素并只获取根

c++ - C++11 中的线程 ID 行为

c++ - 返回简历 :Mat pointer to main function

c++ - 为什么 decltype 将变量定义为引用?

c++ - 模板类中嵌套类的问题