矢量类型的模板类专业化 - 不同的有效语法?
Posted
技术标签:
【中文标题】矢量类型的模板类专业化 - 不同的有效语法?【英文标题】:Template class specialization for vector type - different valid syntax? 【发布时间】:2015-10-02 16:41:30 【问题描述】:在下面的代码片段中,template<>
对于专业化来说是可选的吗?我是否包含它有什么区别吗?我的第一个直觉是把它包括在内,因为它或多或少意味着它是一种专业化。它可以在 g++ 4.9.2 和 Intel 16 下双向编译
#include <vector>
#include <iostream>
template<typename T>
struct PrintMe
static void Print(const T & t)
std::cout << "In general templated struct: " << t << "\n";
;
template<> // <--- optional?
template<typename T>
struct PrintMe<std::vector<T>>
static void Print(const std::vector<T> & t)
std::cout << "In general specialization for vector: " << t.size() << "\n";
for(const auto & it : t)
std::cout << " " << it << "\n";
;
int main(void)
PrintMe<int>::Print(5);
PrintMe<double>::Print(5);
PrintMe<std::vector<float>>::Print(10,20,30,40);
return 0;
注意:出于好奇,我尝试添加多个template<>
。即,
template<>
template<>
template<>
template<typename T>
struct PrintMe<std::vector<T>>
这仍然可以使用 Intel 编译,但不能使用 g++。不知道这意味着什么,但很有趣。
注 2:哇,这与我 5 年前的一个问题非常相似:Templated class specialization where template argument is a template。在那里它被称为冗余语法。
【问题讨论】:
【参考方案1】:给定类模板的定义,
template<> // <--- optional?
template<typename T>
struct PrintMe<std::vector<T>> ... ;
无效。
您需要删除该行并使用:
template<typename T>
struct PrintMe<std::vector<T>> ... ;
【讨论】:
【参考方案2】:有一些方法可以查看模板和模板专业化,它们将描绘出更好的画面并使整个事情更清晰。 对我来说,在这种情况下,更简单的方法是不去想
template<typename T>
struct PrintMe<std::vector<T>> ... ;
专业化
template<typename T>
struct PrintMe ... ;
但是作为一个完全不同的类模板,只是碰巧这两者有相似的命名方法。
【讨论】:
我也是这么想的。它似乎类似于函数模板专业化与重载参数。但是在那种情况下,有一些关于分辨率等的重要细节。也许这里不是这种情况?打印出 typeid() 表明它们具有相同的损坏名称 这里和每个模板都是这种情况,模板专业化基本上是你告诉编译器“不要使用其他植入,使用我在这里给你的这个。”不知道你为什么说它们有相同的重命名,它们是运行时的两个不同的类并且具有不同的名称。以上是关于矢量类型的模板类专业化 - 不同的有效语法?的主要内容,如果未能解决你的问题,请参考以下文章