C++ 标准::共享\u ptr<;无效>;用于从和转换为自定义类型
下午好 因此,我制作了一个库,它需要用作linux和windows下不同应用程序的APi,既可以用作命令行工具,也可以用作gui 在这个库中,我有一个结构的C++ 标准::共享\u ptr<;无效>;用于从和转换为自定义类型,c++,c++11,pointers,visual-studio-2015,shared-ptr,C++,C++11,Pointers,Visual Studio 2015,Shared Ptr,下午好 因此,我制作了一个库,它需要用作linux和windows下不同应用程序的APi,既可以用作命令行工具,也可以用作gui 在这个库中,我有一个结构的std::map,它表示程序要控制的物理对象 我只想通过windows GUI应用程序,而不是任何其他应用程序,传递一些特殊的类。这个特殊的类是一个名为3DModel 因此,我相信如果不使用一堆#define(定义)WIN64等等,我就无法在库中的任何地方引用这个类。也许我可以使用转发声明 库也没有对对象做任何事情,该对象在Windows G
std::map
,它表示程序要控制的物理对象
我只想通过windows GUI应用程序,而不是任何其他应用程序,传递一些特殊的类。这个特殊的类是一个名为3DModel
因此,我相信如果不使用一堆#define(定义)WIN64
等等,我就无法在库中的任何地方引用这个类。也许我可以使用转发声明
库也没有对对象做任何事情,该对象在Windows GUI应用程序中创建,并完全出于组织目的传递到库中(以防止创建重复的std::map
结构来存储这些对象。然后,Windows GUI应用程序调用它来渲染等等)
其他应用程序不会创建此对象,因为它们只会将nullptr
传递给它,而不会使用它
因此,我的问题是,在库中,我可以使用函数参数、std::map
结构等来使用std::shared\u ptr
然后在Windows GUI中,我将创建一个std::shared_ptr
,必要时将其转换为std::shared_ptr
检索它,再次将其转换为std::shared_ptr
,然后使用它进行渲染
这是否合乎道德?有更好的替代方案吗?我听过boost::any的建议,但还没有使用过。我的代码中还没有boost,有标准的替代方案吗
或者,在这种情况下,我会在库中向前声明3DModel
类,但从不#包括“3DModel.h”
谢谢,
-D您不能从一个
共享的ptr
转换到另一个。您可以将共享的ptr
转换到基类,也可以使用原始指针。您还可以按平台使用单独的Model3D impl,而非windows的可能只是抛出的骨架impl?这样,至少API在平台上是一致的,但运行时不会正如你所描述的那样。@MarkRansom@T.C.做得很好。但是我仍然认为,如果你想这样做,你应该有一个基类。@MarkRansom astd::shared_ptr
通常被用作类型擦除技术的一部分。它是C-ishvoid*
的一个更安全的对应物例如,您可以在许多用于容纳用户数据的库中找到。只要您知道自己在做什么,这是一个好主意。您不能从一个共享的\u ptr
转换到另一个。您可以将共享的\u ptr
转换到基类,也可以使用原始指针。您还可以通过平台使用非windows-ones可能只是一个骨架,这样至少API在平台上是一致的,但运行时将如您所述。@MarkRansom@T.C.做得很好。但是我仍然不认为向下转换到void
,如果您想这样做,您应该有一个基类。@MarkRansom astd::shared\u ptr
通常作为类型擦除技术的一部分使用。它是C-ishvoid*
的一个更安全的对应物,例如,您可以在许多用于容纳用户数据的库中找到。只要您知道自己在做什么,这是一个好主意。