具有相同返回类型和相同参数的模板函数

时间:2021-03-14 04:30:54

标签: templates sfinae

我正在尝试创建一个模板函数,如下所示

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 个答案:

答案 0 :(得分:0)

在 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");
}

答案 1 :(得分:0)

使用 typename = std::enable_if_t<(some conditions)> 的样式 SFINAE 将具有相同的功能意义(有时我们喜欢或不喜欢)。所以在这种情况下,您可以使用 std::enable_if_t<(some conditions), int> = 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; }
相关问题