【问题标题】:C++/CX restrictionsC++/CX 限制
【发布时间】:2012-01-13 07:53:29
【问题描述】:

我想用 C++/CX 语法编写一个库,并在其他项目中使用它。

如您所知,普通的旧数据结构不能有任何方法或运算符,因此我们不得不做一些事情,例如在另一个类中编写静态方法来提供行为。

我们也不能这样写代码:

private:
    int _D;
public:
    property int& D { int& get() {return _D;}}

或将此属性传递给这样的方法:

void SampleMethod(int& d);

我不知道为什么 Windows 运行时库有这些限制。

如何在 .lib 文件中编译 C++/CX 和 Windows 运行时扩展?或者如何在另一个项目中预编译整个 WRL 项目的代码文件?

【问题讨论】:

  • 什么是“WRL”和“公共价值结构”?你真的想做什么?
  • C++ 中的struct 只是一种使类默认具有公共成员的方法,而class 默认具有私有成员。这是类和结构的唯一区别。
  • 您确定您的意思是“C++11”而不是“C#”吗?
  • WRL 很可能是 Windows 运行时库,这是一个用于在尚未发布的 Windows 8 中针对 WinRT(沙盒 Metro 风格 UI)的本机 API。
  • 具有扩展名的语言的正确名称是 C++/CX - 我已经相应地更新了它。此外,WRL 是 VC++ 附带的模板库,用于启用对 WinRT 的“低级”(没有语言扩展)访问 - 此代码不以任何方式使用它。 ABI/运行时本身——你使用 /ZW 编译时的目标——被称为 WinRT。

标签: c++ windows-8 windows-runtime c++-cx


【解决方案1】:

WinRT 是一种旨在用于跨语言使用的 ABI - 至少是 C++、C#、VB 和 JS。出于这个原因,它提供的构造仅限于可以在这些语言中以直接方式表示的内容 - 例如,如果您通过引用返回,C# 代码将如何使用它?

如果你想用 C++ 编写一个静态库,只供 C++ 使用,我的建议是尽可能避免语言扩展,只保留那些你必须传递 WinRT 对象的地方。在那种情况下,完全使用 C++/CX 并没有任何好处。

【讨论】:

  • 引用计数之类的期货怎么样。我只关心赢8。
  • 您可以使用 std::shared_ptr 对标准 C++ 类进行引用计数。
  • 引用计数是 boost::intrusive_ptr,shared_ptr 根本不一样,几乎所有用户都需要知道它。 boost.org/doc/libs/1_48_0/libs/smart_ptr/smart_ptr.htm
  • @AlexisWilke shared_ptr 也是引用计数,它只是将引用与对象分开 - 尽管 C++11 中的 std::make_shared 不再如此。出于所有实际目的,shared_ptr + make_shared 是 C++ 中引用计数对象所需的全部内容,除非您正在进行微优化。 intrusive_ptr 用于后者,或者当您拥有缺少智能指针的现有引用计数系统(如 COM)时。
【解决方案2】:

与 C++ 不同,其中“结构”基本上是“所有成员都是公共的类”,在 Windows 运行时,“结构”是一种值类型。因此,它不能有任何方法,包括属性访问器(值类型不能有方法)。

另外,由于结构体是值类型,它们总是按值传递。这意味着将结构传递给方法需要复制结构的内容(值类型意味着每个使用者都在自己的数据类型副本上进行操作)。因此,结构的大小应该相当小(认为“小于 16 字节”)。

如果您需要传递较大的对象,请改用类 - 类通过引用传递,因此可以保存任意数量的数据。

【讨论】:

  • 基本原理听起来很弱 - 我的意思是,没有“值类型”的通用定义阻止它们拥有方法,并且它们确实有它们,例如。网。我很确定在 WinRT 中进行这种设计是有道理的,但知道它会很有趣。是版本控制问题吗?
  • Pavel:虽然 JS 和 C# 确实没有“值类型”构造,但 C++确实 有一个值类型——它被称为“POD”。 Windows 运行时结构只是 C++ POD(有一个奇怪的限制,即字符串在逻辑上是 POD,但实际上不是(这是因为 Windows 运行时字符串是值类型,即使它们在内部实现为指针)。
  • C# 同理确实 有一个值类型结构。它被称为“值类型”,是从System.ValueType 派生的任何类型 :) 至于 C++ POD,与任何其他 C++ 类相比,我不确定是什么使它们成为“值类型”,因为它们都是按值传递的;但是,无论如何,也从来没有禁止 POD 在 C++ 中具有成员函数。无论如何,说“结构在 WinRT 中不能有方法,因为它们是值类型”并不能真正解释太多——下一个明显的问题是,“为什么值类型在 WinRT 中不能有方法?”。
  • Pavel:值类型不能有方法,因为它们没有 vtable - 它们是 POD。请记住,Windows 运行时中所有具有方法的类型都有一个 vtable 来保存方法(引用类型是基于 IUnknown 的)。值类型没有 vtable,所以它们不能有方法。
  • @Pavel:底线是 Windows 运行时值类型没有方法。 Windows 运行时值类型本质上是 C++ POD,就像 C++ POD 没有方法一样,Windows 运行时值类型也没有方法。这有一些相当深刻的技术原因,我很乐意通过电子邮件与您讨论它们,但这不是这些讨论的论坛。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-25
  • 2014-02-20
  • 2016-11-28
  • 1970-01-01
  • 2016-01-29
  • 2013-02-20
  • 2013-04-07
相关资源
最近更新 更多