Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将客户机类与模板类解耦?_C++_Templates - Fatal编程技术网

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

    }
};