模板专业化示例
Template specialization example
据我了解,模板专业化的工作原理如下
template<typename T>
void dummy(T a) { std::cout<<a<<std::endl; }
template<>
void dummy<int>(int a) { std::cout<<"special"<<std::endl; }
我在看下面的代码,它检查某物是否是一个指针:
template<typename T>
struct is_ptr {
constexpr static bool value = false;
};
template <typename T>
struct is_ptr<T*> {
constexpr static bool value = true;
};
这还是模板专业化吗?为什么行 template <typename T>
又出现在专业化中,而不是 <>
。是不是因为只要我们有 T*
而不是 T
,编译器就会生成多个特化?
此代码会扩展为
template<>
struct is_ptr<int*>
{
constexpr static bool value = true;
};
?
你的第一个例子是function template specialization
。 is_ptr
示例是 partial class template specialization
。
函数模板不能部分指定,class 模板可以。
class模板部分特化中template <typename T>
的原因正是因为它部分特化在指针上,但是任何类型T
.
在您的示例中,当使用 is_ptr<int*>::value
时,确实会选择部分专业化。
据我了解,模板专业化的工作原理如下
template<typename T>
void dummy(T a) { std::cout<<a<<std::endl; }
template<>
void dummy<int>(int a) { std::cout<<"special"<<std::endl; }
我在看下面的代码,它检查某物是否是一个指针:
template<typename T>
struct is_ptr {
constexpr static bool value = false;
};
template <typename T>
struct is_ptr<T*> {
constexpr static bool value = true;
};
这还是模板专业化吗?为什么行 template <typename T>
又出现在专业化中,而不是 <>
。是不是因为只要我们有 T*
而不是 T
,编译器就会生成多个特化?
此代码会扩展为
template<>
struct is_ptr<int*>
{
constexpr static bool value = true;
};
?
你的第一个例子是function template specialization
。 is_ptr
示例是 partial class template specialization
。
函数模板不能部分指定,class 模板可以。
class模板部分特化中template <typename T>
的原因正是因为它部分特化在指针上,但是任何类型T
.
在您的示例中,当使用 is_ptr<int*>::value
时,确实会选择部分专业化。