![](/img/trans.png)
[英]Specialize a template to only take a typename of a class with template arguments
[英]Unnamed class/typename in template arguments
我正在浏览SFINAE的文档,并且有以下模板声明:
template<typename SomeType>
struct inner_type { typedef typename SomeType::type type; };
template <
class T,
class = typename T::type, // SFINAE failure if T has no member type
class U = typename inner_type<T>::type // hard error if T has no member type
// (guaranteed to not occur as of C++14)
> void foo(int) {}
具体来说,我在问class = typename T::type
。 声明一个未命名的类有什么意义?
由于评论,我认为当T
没有成员type
时,这将导致编译器错误,但事实并非如此,例如foo<int, int, int>(0);
编译良好。
另一方面
template<class T, typename = std::enable_if_t<std::is_unsigned<T>::value>>
void foo(T t) {}
的确,如果没有编译T
签署,并编译如果T
是无符号。
我在这里想念什么?
foo<int, int, int>(0);
编译良好。
因为您指定了第二个模板参数,所以将不使用默认模板参数(即typename T::type
),也不会触发编译错误。
如果只写foo<int>(0);
要使默认模板参数被使用,编译将失败。
第二个样本也是如此。
声明一个未命名的类有什么意义?
因为template参数不会用于模板实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.