有没有一种方法可以将类的私有枚举值用作模板参数?

时间:2018-10-04 01:28:53

标签: c++ templates enums

是否有一种方法可以使用class-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>设置为私有成员变量而不是从其继承,但是在我的真实代码中,它具有一些我想在子类中覆盖的虚拟方法,因此不会。在这种情况下不能为我工作。

1 个答案:

答案 0 :(得分:1)

您可以将枚举声明为帮助程序类的私有成员,并与该类的朋友MyCatList一起声明。将该帮助程序类添加为私有基础(以将枚举符号带入该类),并在范围为该帮助程序类的模板中引用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;
};

这将在类外声明枚举,但这种方式不是公开的。