【问题标题】:template function with same return type and same argument具有相同返回类型和相同参数的模板函数
【发布时间】:2021-03-14 04:30:54
【问题描述】:

我正在尝试创建如下模板函数

template<typename T>
using IsUnfoldedWire = std::enable_if_t<std::is_same<T, UnfoldedWire>::value>;
template<typename T>
using IsUnfoldedInst = std::enable_if_t<std::is_same<T, UnfoldedInstance>::value>;

template<typename T, typename = IsUnfoldedWire<T>>
unsigned getUnfoldedIndex() const { return _unfoldedWireIndex; }

template<typename T, typename = IsUnfoldedInstance<T>>
unsigned getUnfoldedIndex() const { return _unfoldedInstIndex; }

但是编译器抱怨这 2 个函数不能重载。你能建议我如何使用 模板函数在这里?

【问题讨论】:

    标签: templates sfinae


    【解决方案1】:

    在 C++17 中,你可以使用constexpr if 一个函数就可以了。

    template<typename T>
    unsigned getUnfoldedIndex() const
    {
        if constexpr (std::is_same_v<T, UnfoldedWire>)
            return _unfoldedWireIndex;
        else if constexpr (std::is_same_v<T, UnfoldedInstance>)
            return _unfoldedInstIndex;
        else
            static_assert(false, "invalid type");
    }
    

    【讨论】:

      【解决方案2】:

      使用typename = std::enable_if_t&lt;(some conditions)&gt; 的样式 SFINAE 将具有相同的功能意义(有时我们喜欢或不喜欢)。所以在这种情况下,你可以使用std::enable_if_t&lt;(some conditions), int&gt; = 0的风格:

      template<typename T, std::enable_if_t<std::is_same<T, UnfoldedWire>::value, int> = 0>
      unsigned getUnfoldedIndex() const { return _unfoldedWireIndex; }
      
      template<typename T, std::enable_if_t<std::is_same<T, UnfoldedInstance>::value, int> = 0>
      unsigned getUnfoldedIndex() const { return _unfoldedInstIndex; }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-18
        • 1970-01-01
        • 1970-01-01
        • 2019-04-15
        • 1970-01-01
        • 1970-01-01
        • 2011-07-30
        • 1970-01-01
        相关资源
        最近更新 更多