替代网络化框架上的显式实例化

时间:2015-09-28 16:38:11

标签: c++ templates gcc network-programming

我正在编写一个分布式编程框架,并且我已经了解了客户端模板对象声明和创建的内容。问题是我需要在网络的客户端创建一个对象。我在客户的某个地方:

在服务器端:

template <typename T>
class myRemoteObject{
    myRemoteObject<T>(){
        // tells client to create an object of type T
        sendCreateObject( encodeType(T) );     // This is working
    }
};

int main(){
    ...
    myRemoteObject obj;
    ...
}

在客户端:

case (message.type){
    OBJ_TYPE_INT:
        objPtr = new myObject<int>();
        break;
    OBJ_TYPE_FLOAT:
        objPtr = new myObject<float>();
        break;
}

这给我带来了很多问题。首先,它是不灵活因为我必须静态地声明我在框架内静态使用的每个类型,如果我还想使用容器(矢量等),我也必须明确地实例化它们。

其次,编译非常。 myObject有很多模板化的函数,只编译其中4个实例会占用1.5G的内存并且需要一段时间。我说到它会占用6GB的内存并占用超过1小时(从未完成)。

所以,我选择显式实例化。我创建了几个.cpp文件(12),它们用不同的类型明确地实例化了myObject,在一个单独的文件中声明了myObject模板,并且在前面引用的代码中只包含了.h containsig模板签名。虽然,这个窗台限制了框架功能和

有人知道一种纯粹作为模板的方法吗?所以我只需要实例化主程序使用的类型?我试图将myObject的实例化放在myRemoteObject中,但它不起作用......

ps。:我正在使用C ++ 2011

1 个答案:

答案 0 :(得分:1)

问题在于您尝试实例化在编译时解决的模板,其中包含在运行时解决的消息的数据类型,为时已晚。我唯一的建议是你使用抽象工厂设计模式http://www.tutorialspoint.com/design_pattern/abstract_factory_pattern.htmhttps://en.wikipedia.org/wiki/Abstract_factory_pattern和getObject方法。在ConcreteFactory中,在getObject()或createObject()的实现中,实例化相应的对象并将其返回。

每个ConcreteFactory创建一个特定类型的对象(int,float等)并返回它。

对于任何新类型,您可以使用相应的ConcreteFactory创建一个新插件。

这可以帮助您解决部分问题。