enable_if
您可以通过重载函数(而不是专门化它)然后使用选择性地仅启用一个或其他重载来实现所需的结果:
template<size_t D> typename std::enable_if<D!=0, double>::type my_func(...){}
template<size_t D> typename std::enable_if<D==0, double>::type my_func(...){}
enable_if
约束意味着只有第D!=0
一个重载是一个可行的函数,而D==0
只有第二个重载是一个可行的函数。
在 C++03 中,您可以使用boost::enable_if_c
.
我首选的解决方案是enable_if
用自定义特征类型替换丑陋的用法,可能是这样的:
template<size_t> struct if_zero { typedef double disable; };
template<> struct if_zero<0> { typedef double enable; };
template<size_t D> typename if_zero<D>::disable my_func(...){}
template<size_t D> typename if_zero<D>::enable my_func(...){}
这具有相同的效果,但采用了更加有文化的编程风格。
另一种更容易阅读的形式是:
template<bool, typename T> struct If_ { typedef T enable; };
template<typename T> struct If_<false, T> { };
template<bool B, typename T> using If = typename If_<B, T>::enable;
template<size_t D> If<D!=0, double> my_func(...){}
template<size_t D> If<D==0, double> my_func(...){}
我认为“Concepts Lite”提案将通过像这样限制第二个重载,以更简洁的方式实现这一点:
template<size_t D> double my_func(...){}
template<size_t D> requires (D == 0)
double my_func(...){}
这里第二个重载只能在何时调用,D==0
并且将由重载决议选择,因为它比第一个重载更受约束。