带有额外参数、便于复用的模板

编程语言 2026-07-10

我有一个类模型,非常适合用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
    >

在若干处使用了若干模板参数(tRequiringDomaintProvidingDomain 等)。

由于这是框架的一部分,我想尽量减少输入工作量,因此我想把所有组件封装在一个包装模板中,为最终用户把各部分捆绑在一起。大致思路如下:

Using MyBridgeWrapper = BridgeWrapperT
    <
    MyReqDomain, 
    MyProvDomain,
    <BRIDGE_TEMPLATE>, 
    MySigOpTypeList...
    > {...};

其中 <BRIDGE_TEMPLATE> 将被替换为上面某个 ***BridgeT<> 模板之一,并包含其特定的附加参数(如 const FixedQueueSize tQueueSize)。

为了重用举例,注意 MyReqDomainMyProvDomain 应该能够被转发到 <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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章