c++ - 模板类的不同对象的通用接口(interface)

标签 c++ c++11

C++ 新手,遇到过这样的代码(也不确定这是否是正确的做法)

template<ReqType, RespType>
class StreamManager {
...
...
}

using UpstreamManager = StreamManager<UpstreamReq, UpstreamResp>;
using DownstreamManager = StreamManager<DownstreamReq, DownstreamResp>;
using SidestreamManager = StreamManager<SidestreamReq, SidestreamResp>;

我想实现一个函数,它根据传递给函数的类型返回这些类型之一。有没有办法将其定义为某种常见类型。

**[ReturnType]** CreateStreamManager(StreamType type) {
    switch(type) {
        case upstream:
            return new UpstreamManager();
        case downstream:
            return new DownstreamManager();
        case sidestream:
            return new SidestreamManager();
    }
}

有没有办法为这个 CreateStreamManager 函数定义这个 ReturnType

最佳答案

您可以像这样“重载”函数:

UpstreamManager* CreateStreamManager(UpstreamReq req) {
    return new UpstreamManager();
}
DownstreamManager* CreateStreamManager(DownstreamReq req) {
    return new DownstreamManager();
}

或者您可以编写一个“工厂函数”,但前提是 StreamManager 继承了一个可以是通用返回类型的非模板基类:

class BaseStreamManager {
    virtual ~BaseStreamManager() = default;
};

template<ReqType, RespType>
class StreamManager : public BaseStreamManager {
}

BaseStreamManager* CreateStreamManager(StreamType type) {
    switch(type) {
        case upstream:
            return new UpstreamManager();
        case downstream:
            return new DownstreamManager();
        case sidestream:
            return new SidestreamManager();
    }
}

关于c++ - 模板类的不同对象的通用接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53235613/

相关文章:

c++ - 这是错误的警告吗?

c++ - 测试类型 V 是否属于不带可变参数的元组 <...> 的类型

c++ - CRTP、模板、元编程、转发和静态成员 : a bug in g++ 4. 8?

C++:为什么我不能将一对迭代器传递给 regex_search?

c++ - 如何将结构数组传递给C++

c++ - 如何在 C++ 中生成任意嵌套的 vector ?

linux - 具有带模板参数的函数的模板类上的 Cppcheck 语法错误

c++ - 在包装器中保存抽象值对象和继承的使用

java - 如何构造一个包含多种数据类型值的字节数组?

c++ - Alpha channel 被渲染为黑色。怎么让它透明呢?