C++ 使用此类型函数的优点是什么?
在《C++模板完整指南第二版》的“19.3类型函数”一节中,它提出了以下问题: 假设我们有许多容器模板,例如 std::vector和std::list,以及内置数组。我们想要一个 类型函数,给定这样的容器类型,它将生成元素 类型这可以通过使用部分专门化来实现 然后提供以下答案:C++ 使用此类型函数的优点是什么?,c++,templates,typeinfo,C++,Templates,Typeinfo,在《C++模板完整指南第二版》的“19.3类型函数”一节中,它提出了以下问题: 假设我们有许多容器模板,例如 std::vector和std::list,以及内置数组。我们想要一个 类型函数,给定这样的容器类型,它将生成元素 类型这可以通过使用部分专门化来实现 然后提供以下答案: #include <vector> #include <list> #include <iostream> #include <typeinfo> template&l
#include <vector>
#include <list>
#include <iostream>
#include <typeinfo>
template<typename T>
struct ElementT;
template<typename T>
struct ElementT<std::vector<T>>
{
using Type = T;
};
template<typename T>
struct ElementT<std::list<T>>
{
using Type = T;
};
template<typename T, std::size_t N>
struct ElementT<T[N]>
{
using Type = T;
};
template<typename T>
struct ElementT<T[]>
{
using Type = T;
};
template<typename T>
void printElementType(T const& c)
{
std::cout << "Container of "
<< typeid(typename ElementT<T>::Type).name()
<< " elements\n";
}
int main()
{
std::vector<int> intVec = {1, 2, 3};
std::list<double> doubleList = {1.1, 2.2, 3.3};
bool boolArr[] = {false, false, true, false, true};
//GNU COMPILER:
printElementType(intVec); //Container of i elements
printElementType(doubleList); //Container of d elements
printElementType(boolArr); //Container of b elements
}
#包括
#包括
#包括
#包括
样板
结构元素;
样板
结构元素
{
使用类型=T;
};
样板
结构元素
{
使用类型=T;
};
样板
结构元素
{
使用类型=T;
};
样板
结构元素
{
使用类型=T;
};
样板
无效打印元素类型(T常量和c)
{
标准::cout2个主要差异:
书籍版本获取容器中元素的类型,而您的版本只打印容器的类型。此外,您的版本接受任何类型,即使它不是容器。例如,在书籍版本中,类型是int
,而在您的版本中,类型是std::vector
图书版本“获取”类型。这可以进一步用于定义其他类型。您的版本将打印信息。您只能打印信息。您不能使用它组合其他类型或声明变量
这就像以下两者之间的区别:
int max(int a, int b)
{
if (a > b)
return a ;
else
return b;
}
及
例如,您可以使用图书版本,但不能使用自己的版本:
template <class Container>
typename ElementT<Container>::Type foo(const Container& cont)
{
typename ElementT<Container>::Type sum = 0;
for (const auto& e : cont)
{
sum += e;
}
return sum;
}
模板
typename元素::Type foo(const容器和cont)
{
typename元素t::Type sum=0;
用于(const auto&e:cont)
{
总和+=e;
}
回报金额;
}
2主要区别:
书籍版本获取容器中元素的类型,而您的版本只打印容器的类型。此外,您的版本接受任何类型,即使它不是容器。例如,在书籍版本中,类型是int
,而在您的版本中,类型是std::vector
图书版本“获取”类型。这可以进一步用于定义其他类型。您的版本将打印信息。您只能打印信息。您不能使用它组合其他类型或声明变量
这就像以下两者之间的区别:
int max(int a, int b)
{
if (a > b)
return a ;
else
return b;
}
及
例如,您可以使用图书版本,但不能使用自己的版本:
template <class Container>
typename ElementT<Container>::Type foo(const Container& cont)
{
typename ElementT<Container>::Type sum = 0;
for (const auto& e : cont)
{
sum += e;
}
return sum;
}
模板
typename元素::Type foo(const容器和cont)
{
typename元素t::Type sum=0;
用于(const auto&e:cont)
{
总和+=e;
}
回报金额;
}
std::vector
和T
是不同的类型。std::vector
不是std::vector
元素的容器。std::vector
和T
是不同的类型。std::vector
不是std::vector
元素的容器。
template <class Container>
typename ElementT<Container>::Type foo(const Container& cont)
{
typename ElementT<Container>::Type sum = 0;
for (const auto& e : cont)
{
sum += e;
}
return sum;
}