【问题标题】:Dereferencing C++ pointer to type if possible如果可能,取消引用指向类型的 C++ 指针
【发布时间】:2021-03-16 17:55:46
【问题描述】:
class Foo {
public:
    static const int BAR = 2;
};

typedef Foo T1;
typedef Foo* T2;

int value1 = T1::BAR;  // This works.
int value2 = T2::BAR;  // This doesn't work.

BAR的值可以从T2中提取出来吗?

我正在使用 c++-11。

我认为这将是不好的做法,但我很好奇是否可以做到。

【问题讨论】:

    标签: c++ class c++11 typedef


    【解决方案1】:

    是的。

    您可以使用特征去除指针:

    int value2 = std::remove_pointer<T2>::type::BAR;
    

    或者(C++14 起):

    int value2 = std::remove_pointer_t<T2>::BAR;
    

    (referencelive demo)

    这甚至不是坏习惯,除非有一些更具表现力的方式来实现你的真正目标。

    【讨论】:

      【解决方案2】:

      让我们先看看错误(你应该总是这样做):

      <source>:11:14: error: 'T2' (aka 'Foo *') is not a class, namespace, or enumeration
      int value2 = T2::BAR;// This doesn't work.
      

      很清楚。 Foo* 确实不是类类型、命名空间或枚举。

      您可以通过std::remove_pointer从类型中删除指针:

      int value2 = std::remove_pointer_t<T2>::BAR; // This is awkward, but no error
      

      【讨论】:

      • 在充满模板的语言中,具有任意名称 T 的指针类型并不罕见
      • @AsteroidsWithWings 这是一个你知道T 可以是指针的上下文。我故意试图使陈述不太笼统,“如果你避免,”和“可能会令人困惑”
      • @AsteroidsWithWings 很好,相信。我会删除它
      • 现在只是我答案的副本;)
      • @AsteroidsWithWings 这不是副本。在我发布(和编辑)这个之前,我没有看到你的。当我开始写它时,没有其他答案。但是,是的,它或多或少是一样的
      【解决方案3】:

      您可以创建T2 类型的对象,并访问成员BAR,如下所示:

      int value2 = T2{}->BAR;
      

      请注意,取消引用空指针以访问静态数据成员是否格式正确尚有争议。无论这个解决方案是否正确,我都建议使用Asteroids With Wings' answer,因为它更清楚地表达了代码应该实现的意图。

      【讨论】:

      • 这可能是非常低效的,甚至是完全错误的。
      • @Blindy 当然,但这与Foo 有什么关系?
      • 如果您的代码仅设计用于空类,您应该这样说,我不会有任何问题。但是,正如我之前所说,作为一般性答案,这既低效又语义错误。
      • @Blindy 与一般答案的情况一样,代码旨在与 OP 提供的类完全一致,不多不少。我不确定是否要在答案中添加您建议的注意事项。
      • @AsteroidsWithWings 嗯,“错误”可能很强烈。你的意思是“更穷”或“不合适”,对吧?这是合理的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      • 2011-05-27
      • 2018-05-31
      • 2013-08-07
      • 2017-11-02
      • 1970-01-01
      • 2013-03-11
      相关资源
      最近更新 更多