【问题标题】:How do two structures with same name and with different Template arguments work具有相同名称和不同模板参数的两个结构如何工作
【发布时间】:2016-03-22 16:46:27
【问题描述】:

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

有效的模板结构

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

【问题讨论】:

  • 查看模板专业化

标签: c++ templates c++11 c++14


【解决方案1】:

您总是从模板定义开始:

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 &lt;...&gt; 部分中只有一个类型名称。

在使用中,is_same&lt;int, double&gt; 将匹配模板定义; is_same&lt;int, int&gt; 将匹配部分特化。

您还可以指定完整的专业化。不是你想在这里,而是继续这个例子:

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

显然,这将匹配 is_same&lt;void, void&gt;

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

请注意,这有点过于简单化了。它旨在解决“为什么这些东西不起作用”,而不是“我怎样才能专门化一个模板”。

【讨论】:

  • 我们只能从声明开始。
  • @pete Becker 非常感谢,您能否解释一下如何专门化模板。
【解决方案2】:

语法

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&lt;int, float&gt; 实例化时,无法决定使用哪个模板。

模板不能通过以下方式重载:

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

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

语言根本不允许这样做。

【讨论】:

    猜你喜欢
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    相关资源
    最近更新 更多