模板类不同对象的通用接口

时间:2018-11-10 02:48:41

标签: 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

2 个答案:

答案 0 :(得分:2)

您可以像这样“重载”该功能:

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();
    }
}

答案 1 :(得分:0)

从C ++ 17(我不确定),您可以使用auto说明符作为返回类型。我会这样定义函数:

template<typename ReqType, typename RespType>
auto CreateStreamManager() {
    return new StreamManager<ReqType, RespType>();
}

如果可以在编译时确定类型,则还可以使用constexpr说明符:

constexpr auto CreateStreamManager(StreamType type) {
    switch (type) {
        case upstream:
        return new UpStreamManager();
    ...
}

顺便说一句,分配内存并在没有智能指针的情况下将其返回很不好。