template <bool,typename T>
struct enabler
{
};
template <typename T>
struct enabler<true,T>
{
typedef T type;
};
template <typename T>
void test1(typename enabler< is_integral<T>::value,T >::type input)
{
cout << "this is for only integral" << endl;
}
int main()
{
test1(10);//error
test1<int>(10); // compiles fine
return 0;
}
编译失败,显示错误消息。
注意:模板参数扣除/替换失败
注意:无法推断模板参数'T'
当明确指定参数时,没关系。但如果不是,编译器会发现推理出现问题。为什么呢?
答案 0 :(得分:2)
T
中的{p> typename enabler<is_integral<T>::value, T>::type
是不可扣除的:
§14.8.2.5[temp.deduct.type] / p5:
未推断的上下文是:
(5.1) - 使用 qualified-id 指定的类型的嵌套名称说明符。
一个选项是将enabler
置于返回类型语法中,并将T
推导为普通参数:
template <typename T>
typename enabler<std::is_integral<T>::value, void>::type test1(T input)
{
std::cout << "this is for only integral" << std::endl;
}