C++ 如何将客户机类与模板类解耦?
假设我有一个模板类:C++ 如何将客户机类与模板类解耦?,c++,templates,C++,Templates,假设我有一个模板类: template<typename T> struct Node { T val; Node *next; }; template<typename T> class MyClass { T data1_; T data2_; vector<Node<T> > vi_; }; 它可以工作。但它似乎并不优雅 战略模式是一个很好的解决方案,但模板功能不能是虚拟的 有更好的方法吗?
template<typename T>
struct Node
{
T val;
Node *next;
};
template<typename T>
class MyClass
{
T data1_;
T data2_;
vector<Node<T> > vi_;
};
它可以工作。但它似乎并不优雅
战略模式是一个很好的解决方案,但模板功能不能是虚拟的
有更好的方法吗?您可以这样做:
template<typename T>
class MyClass
{
template <class SERIALIZER>
void save()
{
SERIALIZER::save(data1_);
SERIALIZER::save(data2_);
SERIALIZER::save(vi_);
}
//or with serializer instance
template <class SERIALIZER>
void save(SERIALIZER & s)
{
s.save(data1_);
s.save(data2_);
s.save(vi_);
}
virtual void save(SerializerDetail * s)
{
s->save(this);
}
};
class SerializerDetail
{
public:
template <class T>
void save(T * p)
{
p->save<SomeSerializer>();//use the first two save functions
//or
p->save(SerializerInstance);//or this of you want it
}
};
模板
类MyClass
{
模板
作废保存()
{
序列化程序::保存(数据1);
序列化程序::保存(数据2);
序列化程序::保存(vi_);
}
//或使用序列化程序实例
模板
无效保存(序列化程序(&s)
{
s、 保存(数据1);
s、 保存(数据2);
s、 保存(vi_);
}
虚拟无效保存(序列化尾部*s)
{
s->保存(此);
}
};
类序列化尾部
{
公众:
模板
无效保存(T*p)
{
p->save();//使用前两个save函数
//或
p->save(SerializerInstance);//或者这是您想要的
}
};
从模型中拆分序列化/反序列化。一般来说,把它们混在一起是不好的做法。我建议使用名为save
的静态方法编写一个模板类template Serializer
(类似于您的RawC
和StreamCPP
类),然后使用模板专门化为需要序列化的每个类实现它。另一种方法是普通的DAO
类/接口与提供访问的DAOManager
结合(这将是更类似于OO/java的方法)。看看迭代器特性是如何工作的,这个特性是一个独立的结构,您专门为自己的迭代器设计的。您的“MyClass”只会在需要执行任何操作时咨询该结构。而不是传递一个处理程序。
template<typename T>
class MyClass
{
template <class SERIALIZER>
void save()
{
SERIALIZER::save(data1_);
SERIALIZER::save(data2_);
SERIALIZER::save(vi_);
}
//or with serializer instance
template <class SERIALIZER>
void save(SERIALIZER & s)
{
s.save(data1_);
s.save(data2_);
s.save(vi_);
}
virtual void save(SerializerDetail * s)
{
s->save(this);
}
};
class SerializerDetail
{
public:
template <class T>
void save(T * p)
{
p->save<SomeSerializer>();//use the first two save functions
//or
p->save(SerializerInstance);//or this of you want it
}
};