C++ Typedef重命名类以实现跨平台兼容性

C++ Typedef重命名类以实现跨平台兼容性,c++,typedef,C++,Typedef,因此,我希望我的库与MacOS和Windows具有跨平台兼容性。为了实现这一点,我为每个平台提供了几乎相同的类:MyClassMacOS&MyClassWin。在编译时,我只想使用其中一个并重命名它,以便用户只看到MyClass,我正尝试这样做: header.h #if __APPLE__ # include "MyClassMacOS" namespace n { typedef n::MyClassMacOS MyClass }

因此,我希望我的库与MacOS和Windows具有跨平台兼容性。为了实现这一点,我为每个平台提供了几乎相同的类:
MyClassMacOS
&
MyClassWin
。在编译时,我只想使用其中一个并重命名它,以便用户只看到
MyClass
,我正尝试这样做:

header.h

#if __APPLE__
#   include "MyClassMacOS"
    namespace n {
        typedef n::MyClassMacOS MyClass
    }


#if __WIN__
#  include "MyClassWin.h"
    namespace n {
        typedef n::MyClassWin MyClass
    }
我将typedefs包装在一个名称空间中,以保留原始MyClass所包装的名称空间

问题是代码完成系统同时显示原始定义和新的typedef定义。有没有办法隐藏原来的定义,只显示新的定义?也许我应该寻找一种实现跨平台的不同方式

我考虑过的事情:

  • 将MyClassWin和MyClassMacOS重命名为其他名称。。。但是它仍然会出现在提示中,可能会让用户感到困惑
  • 将MyClassWin和MyClassMacOS重命名为_uMyClassWin和_uMyClassMacOS,它仍然会显示在代码完成中,但只有在您开始键入“u”时才会显示。但是,似乎_;名称是为编译器保留的

    • 最简单的解决方案是完全切换实现,而不允许另一个存在,因为每个平台只能有一个:

      #if __APPLE__
      
      struct MyClass {
          auto function() -> int;
      };
      
      #elif __WIN__
      
      struct MyClass {
          auto function() -> int;
      };
      
      #endif
      
      但为了组织代码,您可以将它们放在不同的标题中:

      myclass_apple.h:

      struct MyClass {
          auto function() -> int;
      
      private:
          AppleSpecificStuff stuff;
      };
      
      myclass_win.h:

      struct MyClass {
          auto function() -> int;
      
      private:
          WinSpecificStuff stuff;
      };
      
      myclass.h:

      #if __APPLE__
      #include "myclass_apple.h"
      #elif __WIN__
      #include "myclass_win.h"
      #endif
      

      然后,您可以将不同的实现放在不同的
      .cpp
      文件中。在构建系统中,只需编译与当前平台相关的实现。

      最简单的解决方案是完全切换实现,而不允许另一个实现存在,因为每个平台只能有一个:

      #if __APPLE__
      
      struct MyClass {
          auto function() -> int;
      };
      
      #elif __WIN__
      
      struct MyClass {
          auto function() -> int;
      };
      
      #endif
      
      但为了组织代码,您可以将它们放在不同的标题中:

      myclass_apple.h:

      struct MyClass {
          auto function() -> int;
      
      private:
          AppleSpecificStuff stuff;
      };
      
      myclass_win.h:

      struct MyClass {
          auto function() -> int;
      
      private:
          WinSpecificStuff stuff;
      };
      
      myclass.h:

      #if __APPLE__
      #include "myclass_apple.h"
      #elif __WIN__
      #include "myclass_win.h"
      #endif
      

      然后,您可以将不同的实现放在不同的
      .cpp
      文件中。在您的构建系统中,只需编译与当前平台相关的系统。

      简单的想法,如果您能够成功的话。两者的头和类定义相同。不同的实现文件,可能需要的帮助。让IDE和链接器处理您使用的实现文件。这两个类的实现有多少不同?它们有共同的功能吗?也许继承、多态性和工厂函数是一种可能的解决方案?@user4581301感谢您的建议,我将研究PIMPL以了解其可行性。您能澄清一下“相同的头和类定义”而“不同的实现文件”是什么意思吗?类定义没有进入实现文件吗?通常情况下,接口,类定义,在实现可移植性时不需要太多更改。无论是Mac、PC、Linux还是Amiga,您对对象的操作都不应该改变。成员功能不应更改。函数的定义可能会有很大的变化,但它们隐藏在一个cpp文件中,用户不在乎它们有多不同,只要可见的行为是相同的。这就留下了成员变量。C++很好地抽象了平台之间的大多数类型差异,其余的通常可以用pPin来隐藏。无论您使用什么构建工具,都必须配置为链接正确的文件,或者教授如何链接正确的文件。两者的头和类定义相同。不同的实现文件,可能需要的帮助。让IDE和链接器处理您使用的实现文件。这两个类的实现有多少不同?它们有共同的功能吗?也许继承、多态性和工厂函数是一种可能的解决方案?@user4581301感谢您的建议,我将研究PIMPL以了解其可行性。您能澄清一下“相同的头和类定义”而“不同的实现文件”是什么意思吗?类定义没有进入实现文件吗?通常情况下,接口,类定义,在实现可移植性时不需要太多更改。无论是Mac、PC、Linux还是Amiga,您对对象的操作都不应该改变。成员功能不应更改。函数的定义可能会有很大的变化,但它们隐藏在一个cpp文件中,用户不在乎它们有多不同,只要可见的行为是相同的。这就留下了成员变量。C++很好地抽象了平台之间的大多数类型差异,其余的通常可以用pPin来隐藏。您使用的任何构建工具都必须配置为链接正确的文件,谢谢您提供的示例。如果我错了,请纠正我,这是pimpl习语?@seanngpack这不是pimpl习语。pimpl习惯用法将实际实现隐藏在cpp文件中,并在标头中公开不完整类型的指针。我的答案是链接时多态性:构建系统在实现之间切换。非常感谢。太棒了,谢谢你的例子。如果我错了,请纠正我,这是pimpl习语?@seanngpack这不是pimpl习语。pimpl习惯用法将实际实现隐藏在cpp文件中,并在标头中公开不完整类型的指针。我的答案是链接时多态性:构建系统在实现之间切换。非常感谢。