我正在尝试创建一个模板函数,如下所示
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; }
但是编译器抱怨这两个函数不能重载。你能建议我如何使用 这里的模板函数?
答案 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; }