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。
我想这是一种糟糕的做法,但我很好奇能否做到这一点。
发布于 2020-12-04 17:04:39
是的,
您可以使用特征来去除指针:
int value2 = std::remove_pointer<T2>::type::BAR;或者(自C++14以来):
int value2 = std::remove_pointer_t<T2>::BAR;(https://en.cppreference.com/w/cpp/types/remove_pointer·https://coliru.stacked-crooked.com/a/c3aa6b7890b43600)
这甚至不是糟糕的练习,除非有更有表现力的方式来达到你真正的目标。
发布于 2020-12-04 17:06:11
您可以创建一个T2类型的对象,并访问成员BAR,如下所示:
int value2 = T2{}->BAR;请注意,取消引用空指针以访问静态数据成员是否格式良好是值得商榷的。不管这个解决方案是否正确,我建议使用有翅膀的小行星,因为它更清楚地表达了代码应该达到的目的。
发布于 2020-12-04 17:08:50
让我们先看看错误(您应该始终这样做):
<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 errorhttps://stackoverflow.com/questions/65147635
复制相似问题