【发布时间】:2012-12-01 16:44:18
【问题描述】:
问题是关于在 MS Visual C++ 11 中开发的代码,只能访问 STL,没有 Boost。
有一个包装模板类,大致有这个头:
template <typename Payload>
class Wrapper {
Payload p;
std::string src;
Wrapper( std::string, Payload );
Payload get(); // returns payload
void set(Payload); // replaces payload
void operator ()(); // uses payload
}
Payload 可以是任何东西 - 指针、整数,甚至是重对象。
稍后,Wrappers 需要放入容器中,例如 std::vector - 但不管它们的具体参数类型如何。这给我带来了麻烦,因为容器需要同质元素。
我已经尝试了基类建议like this from KennyTM,但是它给我的方法get() 和set() 带来了一些问题——从向量中使用时需要强制转换(?),因为如果使用元素看起来像基类在该答案建议的模式中。
【问题讨论】:
-
你需要像
boost::any这样的类型擦除类,你可以自己实现,这样你就可以避免Boost。 -
KennyTM 的解决方案只有在您确实可以使用虚拟功能时才适用。你不能在这里因为你的函数的返回类型不兼容。此外,对象只是模板参数不同并不重要。它们仍然是具有不同大小的不同类型,这对容器来说是最重要的。
标签: c++ templates visual-c++ generics stl