使用派生类定义的枚举的 C++ 模板

C++ Template using an enum defined by a derived class

提问人:lequinne 提问时间:3/20/2023 更新时间:3/20/2023 访问量:70

问:

基本上,这是我的“理想”代码的样子,如果它是合法的:

template<typename ClassName>
class Base{
     ClassName::units_type units;
public:
     Base(ClassName::units_type Units) : units(Units){};
     void SomeFunc(ClassName::units_type Units);
};

class Derived : public Base<Derived>{
public:
     enum units_type{
          meters,
          feet
     };
     using Base::Base;
};

我真正需要的是能够这样称呼它:

Derived d = Derived(Derived::meters);
d.SomeFunc(Derived::feet);

即,我需要单位枚举的范围限定为派生类,并且仅派生类 - 但也可用作基类中的数据类型。

当然,这是行不通的。

c++20 中有一个解决方法,但我正在寻找一个 c++17 解决方案。在 c++20 中,我可以写:

template<typename ClassName, typename units_type>
class Base{
     units_type units;
public:
     Base(units_type Units) : units(Units){};
     void SomeFunc(units_type Units){};
};

enum class DerivedUnits{
     meters,
     feet
};

class Derived : public Base<Derived, DerivedUnits>{
public:
     using enum DerivedUnits;
     using Base::Base;
};

这很好用,我可以打电话

Derived d = Derived(Derived::meters);
d.SomeFunc(Derived::feet);

就像我想要的一样,世界是一个快乐的地方。有没有办法 - 任何方法 - 在 C++17 中实现同样的最终目标?

谢谢 法

C++ 继承 模板继承

评论

0赞 Jarod42 3/20/2023
您的解决方法也应该在 C++17 中工作,不是吗?
0赞 lequinne 3/20/2023
@Jarod42当我尝试在 VC++ 中编译时,我收到错误 C7572“using enum DerivedUnits;”至少需要“/std:c++latest”

答:

2赞 John Zwinck 3/20/2023 #1

“变通办法”解决方案中唯一需要 C++20 的部分是 。您可以像这样轻松避免它:using enum

template<typename ClassName, typename units_type>
class Base{
     units_type units;
public:
     Base(units_type Units) : units(Units){};
     void SomeFunc(units_type Units){};
};

enum class DerivedUnitsImpl{
     meters,
     feet
};

class Derived : public Base<Derived, DerivedUnitsImpl>{
public:
     using DerivedUnits = DerivedUnitsImpl;
     using Base::Base;
};

评论

0赞 lequinne 3/20/2023
这似乎要求我在调用时添加一个额外的范围:Derived d = Derived(Derived::D erivedUnits::meters);我希望能够调用 Derived(Derived::meters)