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 ?
答案 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();
...
}
顺便说一句,分配内存并在没有智能指针的情况下将其返回很不好。