可选模板参数组合

Posted

技术标签:

【中文标题】可选模板参数组合【英文标题】:Optional template parameter combinatorials 【发布时间】:2021-11-09 20:18:52 【问题描述】:

我有一组模板特化 (C++11),它使用下面的基本模板,其中 tPayLoadtReturnType 都存在:

template <class tDerivedOperation, class tBridgeType, class tPayLoadType = void, class tReturnType = void> class OperationT ...

第一个特殊化是既没有 tPayLoadType 也没有 tReturnType

template <class tDerivedOperation, class tBridgeType> class OperationT<tDerivedOperation, tBridgeType, void, void> ...

第二个特化是只有tPayLoadType

template <class tDerivedOperation, class tBridgeType, class tPayLoadType> class OperationT<tDerivedOperation, tBridgeType, tPayLoadType, void> ...

最后,我想要第 3 种情况(第 4 种组合),没有 tPayLoadType 但有一个 tReturnType,这就是问题出现的地方。我不能使用(我认为):

template <class tDerivedOperation, class tBridgeType, class tReturnType> class OperationT<tDerivedOperation, tBridgeType, void, tReturnType> ...

因为这与专业化 2 基本相同。任何人都知道如何做到这一点,如果可能的话???

/否

【问题讨论】:

【参考方案1】:

以下

#include <iostream>
template<class tDerivedOperation, class tBridgeType, class tPayLoadType = void, class tReturnType = void>
struct OperationT 
    static constexpr auto overload = "base";
;

template<class tDerivedOperation, class tBridgeType>
struct OperationT<tDerivedOperation, tBridgeType, void, void> 
    static constexpr auto overload = "both void";
;

template<class tDerivedOperation, class tBridgeType, class tPayLoadType>
struct OperationT<tDerivedOperation, tBridgeType, tPayLoadType, void> 
    static constexpr auto overload = "back void";
;

template<class tDerivedOperation, class tBridgeType, class tReturnType>
struct OperationT<tDerivedOperation, tBridgeType, void, tReturnType> 
    static constexpr auto overload = "front void";
;

int main() 
    std::cout << OperationT<int, int>::overload << '\n';
    std::cout << OperationT<int, int, int>::overload << '\n';
    std::cout << OperationT<int, int, void, int>::overload << '\n';
    std::cout << OperationT<int, int, int, int>::overload << '\n';

给出输出

both void
back void
front void
base

正如人们所期望的那样。这能回答你的问题吗?

【讨论】:

哈,看那个。这对我来说完全不合逻辑。非常感谢。

以上是关于可选模板参数组合的主要内容,如果未能解决你的问题,请参考以下文章

打字稿递归函数组合

Python3 - 排列组合的迭代

第八十八天请假 PHP amarty模板 变量调节器,方法和块函数基本书写格式

django - 可选 url 参数的正则表达式

从 C++ 调用带有可选参数的 Fortran 子例程

从 C++ 调用带有可选参数的 Fortran 子例程