我有一个函数,它具有类型为T的选项参数。
template<typename T>
void foo( const T& t = T() )
{ t.stuff; }
一切都很好,但是我现在有一个T变为的情况void
。在这种情况下,我希望没有操作为空的功能。我拥有的唯一可行的解决方案需要三个单独的声明,并且我有许多此类方法:
template<typename T>
void foo( const T& t)
{ t.stuff; }
template<typename T>
inline void foo()
{ foo(T()); }
template<>
inline void foo<void>() {}
理想情况下,我希望应该有一个更优雅的解决方案来重载“ Void”功能,而无需诉诸第三个声明?尤其是最近有了新的C ++ 17解决了很多事情!更简短的语法会更好...
一个更简单的解决方案(因为只有两个重载)如下所示:
template<typename T>
void foo( const T& t = T() ) {
t.stuff;
}
template<typename T>
std::enable_if_t<std::is_void_v<T>>
foo() {}
// void foo(const T&); is the only viable overload for non-void T,
// since std::enable_if_t SFINAEs
// void foo(); is the only viable overload for void T,
// since const T& forms a reference to void
由于您经常使用此模式,因此可以使用别名模板将其略微缩短:
template<typename T, typename TypeIfVoid = void>
using if_void = std::enable_if_t<std::is_void_v<T>, TypeIfVoid>;
template<typename T>
void foo(const T& t = T()) {
t.stuff;
}
template<typename T>
if_void<T> foo() {}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句