【问题标题】:C++ use inner enum for class templateC++ 使用内部枚举作为类模板
【发布时间】:2017-10-14 13:59:01
【问题描述】:
template <Type T>
class Socket {
public:
    enum class Type {
        TCP,
        UDP
    };
    ...
}

我如何使用枚举Type 作为类模板?我想将其用作Socket::Type::UDP 等。 我尝试在Socket 之前声明enum class Socket::Type,但它不起作用。

【问题讨论】:

  • 你会如何使用它? Socket&lt;Socket&lt;???&gt;::Type::TCP&gt;
  • 我想用Socket::Type::TCP
  • 不可能。在您提供参数之前,模板只是一个模板。
  • 如果要将其保存在某物中,请考虑命名空间。
  • 顺便说一句,为什么您的套接字是模板?套接字不只是二进制数据流吗?

标签: c++ class c++11 templates


【解决方案1】:

每个Socket&lt;...&gt; 都有一个不同的Type 枚举。除了单独的枚举类型之外,不能使用Socket::Type 的一个原因是Socket 的特化甚至不能包含枚举,或者使Type 不是枚举。

您有两个主要选择:

  1. 使用单独命名的类/命名空间:

    class Sockets {
    public:
        enum class Type { ... };
    };
    
    template<Sockets::Type T>
    class Socket { ... };
    
    Socket<Sockets::Type::TCP> s;
    
  2. 使用单独的枚举类型:

    enum class SocketType { ... };
    
    template<SocketType T>
    class Socket { ... };
    
    Socket<SocketType::TCP> s;
    

或者,不要模板Socket。你肯定会得到一堆if (T == TCP) { ... } else { ... }。将公共部分完全分开并为 TCP 和 UDP 使用两种不同的实现可能会更好。

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    相关资源
    最近更新 更多