gpt4 book ai didi

c++ - 有 "unprotect"static const 成员的通用方法吗?

转载 作者:行者123 更新时间:2023-11-30 01:02:48 25 4
gpt4 key购买 nike

有时我会遇到这样一种情况,我会得到一个具有 protected 静态成员的类(无法修改),例如

struct foo {
protected:
static const int x = 42;
static const int y = 101;
static const int z = 404;
// ... and more ...
};

不幸的是,我需要访问这些成员,而不是在派生类中,而是在其他代码中。我写了这个:

struct bar : foo {
static const int x = foo::x;
static const int y = foo::y;
static const int z = foo::z;
};

但感觉很笨拙。从长远来看,应该修改类 foo 以提供对这些常量的访问,但只要不是这种情况,我就希望有更好的东西。我可以按照

行编写一个宏
int x = SOME_MACRO_VOODOO(foo,x);

虽然,我想知道是否有办法避免宏。我尝试了很多方法,例如这个

struct f {
protected:
static const int x = 42;
};

template <typename T, int T::*P>
struct bar : f {
int get_value() { return this->*P;}
};

int main() {
bar<f,&f::x>().get_value();
}

失败,因为 &f::x 不是指向成员的指针,而只是一个 int *,当然还有 f::x不可访问:

prog.cc: In function 'int main()':
prog.cc:12:16: error: could not convert template argument '& f::x' from 'const int*' to 'int f::*'
bar<f,&f::x>().get_value();
^
prog.cc:12:5: error: 'const int f::x' is protected within this context
bar<f,&f::x>().get_value();
^~~~~~~~~~~~
prog.cc:3:22: note: declared protected here
static const int x = 42;

最佳答案

听起来您正在寻找 using declaration .您可以在类定义的上下文中使用 using 将成员从基类导入派生类。如果 using 与您正在导入的成员之一具有不同的访问规范,那么您实际上是在派生类的上下文中“更改”该成员的访问规范。

struct foo {
protected:
static const int x = 42;
static const int y = 101;
static const int z = 404;
// ... and more ...
};


struct bar : foo {
using foo::x;
using foo::y;
using foo::z;
};

int main()
{
// Should work fine
int a = bar::x;
}

关于c++ - 有 "unprotect"static const 成员的通用方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55457979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com