C++ 标准::共享\u ptr<;无效>;用于从和转换为自定义类型

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

下午好

因此,我制作了一个库,它需要用作linux和windows下不同应用程序的APi,既可以用作命令行工具,也可以用作gui

在这个库中,我有一个结构的
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 a
std::shared_ptr
通常被用作类型擦除技术的一部分。它是C-ish
void*
的一个更安全的对应物例如,您可以在许多用于容纳用户数据的库中找到。只要您知道自己在做什么,这是一个好主意。您不能从一个
共享的\u ptr
转换到另一个。您可以将
共享的\u ptr
转换到基类,也可以使用原始指针。您还可以通过平台使用非windows-ones可能只是一个骨架,这样至少API在平台上是一致的,但运行时将如您所述。@MarkRansom@T.C.做得很好。但是我仍然不认为向下转换到
void
,如果您想这样做,您应该有一个基类。@MarkRansom a
std::shared\u ptr
通常作为类型擦除技术的一部分使用。它是C-ish
void*
的一个更安全的对应物,例如,您可以在许多用于容纳用户数据的库中找到。只要您知道自己在做什么,这是一个好主意。