具有相同名称和不同模板参数的两个结构如何工作

How do two structures with same name and with different Template arguments work

本文关键字:两个 工作 何工作 结构 参数      更新时间:2023-10-16

为什么只有第一个实现有效,而下面指定的其他实现不起作用,有人可以解释一下这个模板结构的工作方式以及为什么其他人不这样做。

有效的模板结构

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;
};

模板结构不起作用

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;
};

还有一个不起作用

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;
};

和主要功能

template <class A, class B>
bool IsSameClass() {
  return is_same<A, B>::value;
}
int main()
{
  bool ret =    IsSameClass<P,C>();
}

您始终从模板定义开始:

template <class T, class U>
class is_same { ... };

或者,正如 Jarod42 提醒我的那样,用一个声明:

template <class T, class U> class is_same;

有了模板后,可以通过优化一个或多个模板参数来定义部分专用化,如示例中所示:

template <class T>
class is_same<T, T> { ...};

专用化仍然需要两个参数,就像原始模板一样,但它们是相同的类型,因此在定义的template <...>部分中只有一个类型名称。

在使用中,is_same<int, double>将与模板定义匹配; is_same<int, int>将与部分专业化相匹配。

您还可以指定完全专业化。不是你想在这里,而是按照这个例子:

template <>
class is_same<void, void> { ... };

显然,这将匹配is_same<void, void>.

其他两次尝试不起作用的原因是它们都没有模板定义,只有看起来像专业化的东西。没有定义,就没有什么可以专业化的。

请注意,这有点过于简单化了。它旨在解决"为什么这些东西不起作用",而不是"我如何专门化模板"。

语法

template <typename T, typename U>
struct is_same<T, U>
{
   static const bool value = false;
};

用于创建类模板的专用化。为此,您必须首先声明模板或首先创建其泛型定义。

template <typename T, typename U> struct is_same;

template <typename T, typename U>
struct is_same
{
   static const bool value = false;
};

即使你这样做了,

template <typename T, typename U>
struct is_same<T, U>
{
   static const bool value = false;
};

不是有效的专用化,因为无法决定在使用 is_same<int, float> 实例化时使用哪个模板。

不能使用以下方法重载模板:

template <typename T, typename U>
struct is_same
{
   static const bool value = false;
};
template <typename T>
struct is_same
{
   static const bool value = true;
};

语言根本不允许这样做。