【问题标题】:How we can pass std::shared_ptr or std::string or std::vectors in objective - C我们如何在目标中传递 std::shared_ptr 或 std::string 或 std::vectors - C
【发布时间】:2020-12-29 13:49:59
【问题描述】:

我有以下 C++ 抽象类,我必须在目标 C 中实现这个抽象类。这个接口需要 std::shared_ptr 和 std::vector。我可以在objectve-C中实现这个类吗?或者有什么替代方法可以在objective-C中实现这个类。 注意:在 Objective-C 中实现这个类的原因是因为我正在为定义的接口编写 iOS Metal 的包装器。而且 iOS metal 没有 C++ API,它只有客观的 API。

class GPUDevice{ 
 public:
    virtual ~GPUDevice() {

    }
    virtual GPU_TYPE getType() = 0;
    std::vector<GPU_OPERATIONS> supportedGPUOperations{GPU_OPERATIONS::RENDERING,GPU_OPERATIONS::COMPUTE};
    virtual std::shared_ptr<GPUQueue> createQueueForOperation(GPU_OPERATIONS gpuOperations)  = 0;
    virtual std::shared_ptr<GPURenderPass> createRenderPass(GPUTextureFormats formats)  = 0;
    virtual std::shared_ptr<GPUPipeLine> createGPUPipeline(const std::string& fragmentShader, const std::string& vertextShader,const std::shared_ptr<GPURenderPass>& renderpass,const std::vector<GPUBinding>& bindings) = 0; };

【问题讨论】:

  • 为此您需要Objective-C++Objective-C++ 来源有 .mm 文件扩展名

标签: c++ ios objective-c metal


【解决方案1】:

只需将您的文件从 .m 重命名为 .mm 即可告诉编译器您正在使用目标 C++。之后就可以使用 C++ 代码了。

【讨论】:

    【解决方案2】:

    要使用 C++,正如其他人所引用的,您需要将文件定义为 Objective-C++。一个不需要重命名文件。是的,重命名文件以使用.mm 将自动执行此操作。但是,当您有预先存在的文件(即已使用 .cpp 或其他 C++ 扩展名命名的文件)时,还有另一种方法会很有帮助。

    您可以在文件检查器中将类型更改为Objective-C++ Source(可在菜单View:Inspectors:Show File Inspector 中使用或使用快捷方式Opt+Cmd+1)。

    注意:如果文件已经是 .m,那么我建议将扩展名更改为 .mm

    您将在右侧看到以下内容。只需更改类型即可。

    【讨论】:

      猜你喜欢
      • 2012-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-11
      • 1970-01-01
      • 1970-01-01
      • 2014-08-10
      • 2013-09-21
      相关资源
      最近更新 更多