use*_*825 4 c++ templates c++11 c++14
为什么只有第一个实现工作而不是下面指定的其他实现,有人可以解释这个模板结构的工作方式以及其他人不能工作的原因.
有效的模板结构
template <typename T, typename U>
struct is_same
{
static const bool value = false;
};
template <typename T>
struct is_same<T, T>
{
static const bool value = true;
};
Run Code Online (Sandbox Code Playgroud)
模板结构不起作用
template <typename T, typename U>
struct is_same<T, U>
{
static const bool value = false;
};
template <typename T>
struct is_same<T, T>
{
static const bool value = true;
};
Run Code Online (Sandbox Code Playgroud)
还有一个不起作用
template <typename T, typename U>
struct is_same<T,U>
{
static const bool value = false;
};
template <typename T>
struct is_same
{
static const bool value = true;
};
Run Code Online (Sandbox Code Playgroud)
和主要功能
template <class A, class B>
bool IsSameClass() {
return is_same<A, B>::value;
}
int main()
{
bool ret = IsSameClass<P,C>();
}
Run Code Online (Sandbox Code Playgroud)
您总是从模板定义开始:
template <class T, class U>
class is_same { ... };
Run Code Online (Sandbox Code Playgroud)
或者,正如Jarod42提醒我的那样,声明:
template <class T, class U> class is_same;
Run Code Online (Sandbox Code Playgroud)
一旦有了模板,您可以通过改进一个或多个模板参数来定义部分特化,如您的示例所示:
template <class T>
class is_same<T, T> { ...};
Run Code Online (Sandbox Code Playgroud)
专门化仍然需要两个参数,就像原始模板一样,但它们是相同的类型,因此template <...>在定义的部分中只有一个类型名称.
在使用中,is_same<int, double>将匹配模板定义; is_same<int, int>将匹配部分特化.
您还可以指定完整的专业化.不是你想在这里,但继续这个例子:
template <>
class is_same<void, void> { ... };
Run Code Online (Sandbox Code Playgroud)
显然,这很匹配is_same<void, void>.
其他两个尝试不起作用的原因是它们都没有模板定义,只有看起来像特化的东西.如果没有定义,就没有什么特别的了.
请注意,这有点过于简单化了.它旨在解决"为什么这些东西不起作用",而不是"我如何专门化模板".
| 归档时间: |
|
| 查看次数: |
677 次 |
| 最近记录: |