我正在编写一个分布式编程框架,并且我已经了解了客户端模板对象声明和创建的内容。问题是我需要在网络的客户端创建一个对象。我在客户的某个地方:
在服务器端:
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
答案 0 :(得分:1)
问题在于您尝试实例化在编译时解决的模板,其中包含在运行时解决的消息的数据类型,为时已晚。我唯一的建议是你使用抽象工厂设计模式http://www.tutorialspoint.com/design_pattern/abstract_factory_pattern.htm,https://en.wikipedia.org/wiki/Abstract_factory_pattern和getObject方法。在ConcreteFactory中,在getObject()或createObject()的实现中,实例化相应的对象并将其返回。
每个ConcreteFactory创建一个特定类型的对象(int,float等)并返回它。
对于任何新类型,您可以使用相应的ConcreteFactory创建一个新插件。
这可以帮助您解决部分问题。