C++ 使用此类型函数的优点是什么?

C++ 使用此类型函数的优点是什么?,c++,templates,typeinfo,C++,Templates,Typeinfo,在《C++模板完整指南第二版》的“19.3类型函数”一节中,它提出了以下问题: 假设我们有许多容器模板,例如 std::vector和std::list,以及内置数组。我们想要一个 类型函数,给定这样的容器类型,它将生成元素 类型这可以通过使用部分专门化来实现 然后提供以下答案: #include <vector> #include <list> #include <iostream> #include <typeinfo> template&l

在《C++模板完整指南第二版》的“19.3类型函数”一节中,它提出了以下问题:

假设我们有许多容器模板,例如 std::vector和std::list,以及内置数组。我们想要一个 类型函数,给定这样的容器类型,它将生成元素 类型这可以通过使用部分专门化来实现

然后提供以下答案:

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