具有相同名称和不同模板参数的两个结构如何工作
How do two structures with same name and with different Template arguments work
为什么只有第一个实现有效,而下面指定的其他实现不起作用,有人可以解释一下这个模板结构的工作方式以及为什么其他人不这样做。
有效的模板结构
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;
};
语言根本不允许这样做。
相关文章:
- C++控制台应用,其中有两个冲突的对象不工作
- 我的解码程序的两个部分没有按预期工作
- 给定的两个代码有什么区别.一个在 ideone 上运行时超出时间限制,另一个工作正常
- 使用两个命名空间只能部分工作
- 在循环工作时,首先将两个文件读为向量,但仅次于迭代一次
- OpenGL Ping Pong可与一张通行证一起工作,而不是两个通行证
- 两个超载的STD ::前进工作如何
- 除了两个构造函数外,C++库导入也可以工作
- 在打印出动态分配的数组中的前两个数字时遇到问题,其他数字工作正常
- 如何使其工作,两个类的问题
- 如何在路径规格中工作两个点
- 具有两个OpenGL图形视图的MFC MDI拆分器无法工作
- 逗号(,)在条件部分中两个表达式之间的for循环中的工作方式
- 提升:两个工作线程,使主线程休眠,直到它们都完成
- C++模需要在两个*无*符号字节之间进行减法转换才能工作,为什么
- 具有相同名称和不同模板参数的两个结构如何工作
- 两个双精度值的 C++ 比较无法正常工作
- 当两个不同的参数中有空格时,C++系统()不工作
- 如何使这两个模板类协同工作?(C++中的属性)
- 通过使用两个凸壳的切线来合并它们的算法在实践中是如何工作的