使用来自 class 模板范围的枚举而不指定模板参数
Using the enum from class template's scope without specyfing template parameters
有这样的代码:
template<size_t lines, size_t line_size> class Lcd
{
public:
enum class Interface : uint8_t
{
_8_BIT = 0x30,
_4_BIT = 0x20,
};
Lcd(Interface interface);
// some other stuff
}
int main()
{
Lcd<4, 20> lcd(Lcd<4, 20>::Interface::_4_BIT);
}
我能否更改代码,以便在不使用 <4, 20>
说明符的情况下调用 Interface
枚举,因为枚举是通用的?
我希望枚举在 Lcd
范围内,我需要 lines
和 line_size
通过模板参数传递。保持原样可以吗?
Could I change the code so that it would be possible to call the
Interface
enum without using the <4, 20>
specifier as the enum is
universal?
不行,不可能。正如 @super 已经在评论中提到的,为了访问模板中的内容 class,您需要指定模板参数。
最好的办法是将模板 class 放在命名空间中,并将 Interface
枚举放在 class 之外的命名空间中,这样可以避免 <4, 20>
.
namespace TClasses
{
enum class Interface : uint8_t {
_8_BIT = 0x30,
_4_BIT = 0x20,
};
template<std::size_t lines, std::size_t line_size> class Lcd
{
// ...code
};
}
现在
TClasses::Lcd<4, 20> lcd{ TClasses::Interface::_4_BIT };
I would prefer for the enum to be inside the Lcd
scope and I need the
lines
and line_size
to be passed through template parameters.
然后没有其他选项可以使用,如您所示。但是,如果您坚持要少打字,我建议 an alias template 用于 class 范围之外的 Interface
。
// type alias for the Interface
template<size_t lines, size_t line_size>
using LcdEnum = typename Lcd<lines, line_size>::Interface;
这会让你写
Lcd<4, 20> lcd{ LcdEnum<4, 20>::_4_BIT };
// ^^^^^^^^^^^^^^^^^^^^^^
此外,如果您为 Lcd
提供 a class template deduction guide,您只需提及一次 <4, 20>
(即 Lcd lcd{ LcdEnum<4u, 20u>::_4_BIT }
)。那部分我留给你。
有这样的代码:
template<size_t lines, size_t line_size> class Lcd
{
public:
enum class Interface : uint8_t
{
_8_BIT = 0x30,
_4_BIT = 0x20,
};
Lcd(Interface interface);
// some other stuff
}
int main()
{
Lcd<4, 20> lcd(Lcd<4, 20>::Interface::_4_BIT);
}
我能否更改代码,以便在不使用 <4, 20>
说明符的情况下调用 Interface
枚举,因为枚举是通用的?
我希望枚举在 Lcd
范围内,我需要 lines
和 line_size
通过模板参数传递。保持原样可以吗?
Could I change the code so that it would be possible to call the
Interface
enum without using the<4, 20>
specifier as the enum is universal?
不行,不可能。正如 @super 已经在评论中提到的,为了访问模板中的内容 class,您需要指定模板参数。
最好的办法是将模板 class 放在命名空间中,并将 Interface
枚举放在 class 之外的命名空间中,这样可以避免 <4, 20>
.
namespace TClasses
{
enum class Interface : uint8_t {
_8_BIT = 0x30,
_4_BIT = 0x20,
};
template<std::size_t lines, std::size_t line_size> class Lcd
{
// ...code
};
}
现在
TClasses::Lcd<4, 20> lcd{ TClasses::Interface::_4_BIT };
I would prefer for the enum to be inside the
Lcd
scope and I need thelines
andline_size
to be passed through template parameters.
然后没有其他选项可以使用,如您所示。但是,如果您坚持要少打字,我建议 an alias template 用于 class 范围之外的 Interface
。
// type alias for the Interface
template<size_t lines, size_t line_size>
using LcdEnum = typename Lcd<lines, line_size>::Interface;
这会让你写
Lcd<4, 20> lcd{ LcdEnum<4, 20>::_4_BIT };
// ^^^^^^^^^^^^^^^^^^^^^^
此外,如果您为 Lcd
提供 a class template deduction guide,您只需提及一次 <4, 20>
(即 Lcd lcd{ LcdEnum<4u, 20u>::_4_BIT }
)。那部分我留给你。