带有额外参数、便于复用的模板
我有一个类模型,非常适合用CRTP模板。大多数信息是静态的,类是单例,因此我可以通过类型名访问它们,而不是对象引用。
伪代码:
// Bridge base template class
BridgeBaseT
<
class tDerivedBridgeType,
class tRequiringDomain,
class tProvidingDomain
>;
// Bridge types
SingleBridgeT
<
class tDerivedBridgeType,
class tRequiringDomain,
class tProvidingDomain
>
: public BridgeBaseT<tDerivedBridgeType, tRequiringDomain,
tProvidingDomain>;
ThreadedFixedBridgeT
<
class tDerivedBridgeType,
class tRequiringDomain,
class tProvidingDomain,
const FixedQueueSize tQueueSize = FixedQueueSize::_15_SLOTS
>
: public BridgeBaseT<tDerivedBridgeType, tRequiringDomain,
tProvidingDomain>;
ThreadedDynamicBridgeT
<
class tDerivedBridgeType,
class tRequiringDomain,
class tProvidingDomain,
const unsigned int tInitialQueueSize = 16,
const unsigned int tQueueIncrement = 8
>
: public BridgeBaseT<tDerivedBridgeType, tRequiringDomain,
tProvidingDomain>;
// Base class for signals and operations
SigOpT
<
class tDerivedSigOp,
class tRequiringDomain,
class tProvidingDomain
>
在若干处使用了若干模板参数(tRequiringDomain、tProvidingDomain 等)。
由于这是框架的一部分,我想尽量减少输入工作量,因此我想把所有组件封装在一个包装模板中,为最终用户把各部分捆绑在一起。大致思路如下:
Using MyBridgeWrapper = BridgeWrapperT
<
MyReqDomain,
MyProvDomain,
<BRIDGE_TEMPLATE>,
MySigOpTypeList...
> {...};
其中 <BRIDGE_TEMPLATE> 将被替换为上面某个 ***BridgeT<> 模板之一,并包含其特定的附加参数(如 const FixedQueueSize tQueueSize)。
为了重用举例,注意 MyReqDomain 与 MyProvDomain 应该能够被转发到 <BRIDGE_TEMPLATE>。MySigOpTypeList 是一个由 SigOpT<>:s构成的参数包。
问题在于我找不到一种通用的 <BRIDGE_TEMPLATE>,能够支持所有不同的桥接模板。
<BRIDGE_TEMPLATE> 可以是一个模板模板,但面向带线程的桥接时,额外参数的多样性会让事情变得复杂。我的一个想法是使用一个以参数包结尾的基类,例如:
BridgeBaseT
<
class tDerivedBridgeType,
class tRequiringDomain,
class tProvidingDomain,
class... tAdditionalBridgeParams
>;
之所以不起作用,是因为额外的参数是常量整型值,不能包含在参数包中。
我尝试了无数其他做法,似乎总是陷入模板不工作的各种边界情况。
顺便说一下,我使用的是C++14,但并不完全受限于它。
解决方案
典型的修正办法有:
- 使用traits/config类型来替代原始的额外模板参数
- 将每个桥接模板包装在一个具有统一签名的适配器中
- 将额外设置移动到策略/配置结构体
- 在较新的C++中,更灵活地使用
auto非类型模板参数,尽管即便如此,通常仍然需要一个适配层
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。