提问人:lequinne 提问时间:3/20/2023 更新时间:3/20/2023 访问量:70
使用派生类定义的枚举的 C++ 模板
C++ Template using an enum defined by a derived class
问:
基本上,这是我的“理想”代码的样子,如果它是合法的:
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 中实现同样的最终目标?
谢谢 法
答:
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)
评论