gpt4 book ai didi

c++ - 有没有办法将类的私有(private)枚举值用作模板参数?

转载 作者:行者123 更新时间:2023-11-28 04:31:56 25 4
gpt4 key购买 nike

有没有办法使用类私有(private)枚举中的值作为其模板化基类的模板值?

这是我希望能够执行的操作的示例:

template<int NumCats> class CatList
{
public:
CatList() {/* empty */}

private:
int cats[NumCats];
};

class MyCatList : private CatList<NUM_CATS>
{
public:
MyCatList() {/* empty */}

private:
enum {
CAT_TABBY = 0,
CAT_GINGER,
CAT_CALICO,
NUM_CATS
};
};

int main(int, char **)
{
MyCatList myCats;
return 0;
}

...但是上面给了我编译错误:

Jeremys-Mac-Pro:~ jaf$ g++ temp.cpp
temp.cpp:10:38: error: use of undeclared identifier 'NUM_CATS'
class MyCatList : private CatList<NUM_CATS>
^
temp.cpp:11:4: error: expected class name
{
^
2 errors generated.

我知道我可以将枚举移动到 MyCatList 的声明之外/之前,但这会使枚举公开,如果可能的话,我更愿意将其隐藏为实现细节。

另一个可能的改变是制作CatList<NUM_CATS>一个私有(private)成员变量而不是从它继承,但在我的真实代码中它有一些我想在我的子类中重写的虚拟方法,所以在这种情况下这对我不起作用。

最佳答案

您可以将枚举声明为辅助类的私有(private)成员,MyCatList 是该类的友元。将该辅助类添加为私有(private)基类(将枚举符号引入类中),并在辅助类范围内的模板中引用 NUM_CATS。

class MyCatListEnumerator {
friend class MyCatList;
enum {
CAT_TABBY = 0,
CAT_GINGER,
CAT_CALICO,
NUM_CATS
};
};

class MyCatList : private MyCatListEnumerator, private CatList<MyCatListEnumerator::NUM_CATS>
{
public:
MyCatList() {/* empty */}

int first_cat = CAT_TABBY;
};

这在类外声明了枚举,但以不公开的方式声明。

关于c++ - 有没有办法将类的私有(private)枚举值用作模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52637715/

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