我正在尝试创建一个如下所示的模板函数
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; }
但是编译器抱怨这两个函数不能重载。你能建议我如何使用模板函数?
在C++17中,如果一个功能就能实现。
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");
}
使用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; }