首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果可能的话,将C++指针删除为类型

如果可能的话,将C++指针删除为类型
EN

Stack Overflow用户
提问于 2020-12-04 17:00:53
回答 3查看 99关注 0票数 2
代码语言:javascript
复制
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。

我想这是一种糟糕的做法,但我很好奇能否做到这一点。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-12-04 17:04:39

是的,

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

代码语言:javascript
复制
int value2 = std::remove_pointer<T2>::type::BAR;

或者(自C++14以来):

代码语言:javascript
复制
int value2 = std::remove_pointer_t<T2>::BAR;

(https://en.cppreference.com/w/cpp/types/remove_pointer·https://coliru.stacked-crooked.com/a/c3aa6b7890b43600)

这甚至不是糟糕的练习,除非有更有表现力的方式来达到你真正的目标。

票数 6
EN

Stack Overflow用户

发布于 2020-12-04 17:06:11

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

代码语言:javascript
复制
int value2 = T2{}->BAR;

请注意,取消引用空指针以访问静态数据成员是否格式良好是值得商榷的。不管这个解决方案是否正确,我建议使用有翅膀的小行星,因为它更清楚地表达了代码应该达到的目的。

票数 1
EN

Stack Overflow用户

发布于 2020-12-04 17:08:50

让我们先看看错误(您应该始终这样做):

代码语言:javascript
复制
<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从类型中删除指针。

代码语言:javascript
复制
int value2 = std::remove_pointer_t<T2>::BAR; // This is awkward, but no error
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65147635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档