【问题标题】:How to define an cell equivalent with `using cell = pair<void*, cell*>`?如何使用 `using cell = pair<void*, cell*>` 定义等效单元格?
【发布时间】:2018-03-27 03:43:09
【问题描述】:

根据 C++ 标准 n3376,以下代码格式不正确。

using cell = pair<void*, cell*>; // ill-formed

有什么方法可以实现cell,这是一个合理的数据结构,而无需在C++中定义一个新的cell类?

【问题讨论】:

  • 您似乎在问,“我怎样才能诱使编译器认为格式错误的代码是格式正确的代码?”
  • @RSahu,其实这是一个与LinkedListNode类似的常用结构。一个简单的实现是有用的。
  • 你可以使用自定义的pair吗?
  • @PasserBy,是的,我可以。这是我项目中的一个类似示例。
  • @ZijingWu,主要区别在于您定义的是类型别名。它没有定义类型。 LinkedListNode 是一种类型。

标签: c++


【解决方案1】:

以(相当)可读性为代价,您可以使用自定义 pair 和一些专业化来实现类似的目标

struct self {};

template<typename F, typename S>
struct pair
{
    F first;
    S second;

    // ...
};

template<typename F>
struct pair<F, self*> : pair<F, pair*>
{
};

然后你写

using cell = pair<void*, self*>;

【讨论】:

    【解决方案2】:

    据我所知,您唯一的选择是继承,即

    struct cell : std::pair<void*,cell*> { };
    

    如果您需要 cellstd::pair&lt;void*,cell*&gt; 的类型相同,您可以在重要的时候将前者转换为后者。

    【讨论】:

    • OP 不想将单元格定义为一个类。另外,我不认为您可以从std::pair 派生。
    • 我知道,但我认为给他看这个会更有成效,然后直接说
    • “我认为你不能从std::pair派生”。为什么? std::pair 不是标准中的 final
    • 我找不到库中关于能够/不能从标准库中定义的类派生的部分。
    • @RSahu 这只是一般准则。合理的是,由于标准没有规定库实现,因此可能会出现意外行为,因为成员变量或函数可能会被掩盖。在这里,我们没有向结构添加任何新内容,因此它是完全安全的。
    【解决方案3】:

    另一种选择是使用

    using cell = pair<void*, void*>;
    

    然后在必要时将第二个元素转换为正确的类型。您可以为此编写一个函数,例如

    cell& get_cell(cell& x) {
      return *static_cast<cell*>(x.second);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-24
      相关资源
      最近更新 更多