使用来自 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 范围内,我需要 linesline_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 })。那部分我留给你。