【问题标题】: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 基本相同。任何人都知道如何做到这一点,如果可能的话???

/否

【问题讨论】:

    标签: c++ templates arguments default specialization


    【解决方案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
    

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

    【讨论】:

    • 哈,看那个。这对我来说完全不合逻辑。非常感谢。
    猜你喜欢
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 2016-01-22
    • 1970-01-01
    • 2016-06-27
    • 2016-12-01
    • 2016-08-11
    相关资源
    最近更新 更多