Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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++;11在运行时?_C++_C++11_Templates_Variant - Fatal编程技术网

C++ 如何在C++;11在运行时?

C++ 如何在C++;11在运行时?,c++,c++11,templates,variant,C++,C++11,Templates,Variant,我创建了一个套接字包装器。可以使用两个模板对其进行实例化: Socket<asio::ip::udp> Socket<asio::ip::tcp> Socket 插座 在一个单例类中,我想实例化其中一个,但我得到了一个运行时参数,可以做出选择。如何在运行时实例化其中一个 我知道boost::variant,有没有一种没有它的方法?你不能用一种好的方法。一种可能性是有一个抽象基类,它继承自。然后你可以有一个工厂函数,它返回一个指向基类的指针,并创建正确的实例。@Some

我创建了一个套接字包装器。可以使用两个模板对其进行实例化:

Socket<asio::ip::udp>
Socket<asio::ip::tcp>
Socket
插座
在一个单例类中,我想实例化其中一个,但我得到了一个运行时参数,可以做出选择。如何在运行时实例化其中一个


我知道boost::variant,有没有一种没有它的方法?

你不能用一种好的方法。一种可能性是有一个抽象基类,它继承自。然后你可以有一个工厂函数,它返回一个指向基类的指针,并创建正确的实例。@Someprogrammerdude该基类必须有虚拟方法,这使得模板有点毫无意义。对吧?@怪诞的并不是毫无意义的。这将消除他们“不需要虚拟调用”的速度优势,这只有在代码对时间足够关键的情况下才重要。“只编写一次代码来处理不同类型的代码”的优点仍然存在。@也许有些奇怪。但正如我所说,没有好的方法来做。注意,C++使用模板而不是泛型。这意味着实例化发生在构建时,而不是运行时:必须为程序中的每个实例化编译一个不同的类。这也意味着模板不是解决问题的直接工具。在OO编程中,自然设计将是一些编程人员建议的一个公共基类<代码>标准:变体或基于
void*
的任何其他方式也可能有帮助。最好的方法取决于大量的参数,包括您已经使用过的参数,并且您更了解这些参数。