簡體   English   中英

使用此類型函數的優點是什么?

[英]What is the advantage of using this Type Function?

在“ C ++ Templats完整指南第二版”一書的“ 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
}

我的問題是,當我們可以編寫像波紋管這樣的簡單函數時,這種方法的優勢是什么?

#include <iostream>
#include <typeinfo>
#include <vector>
#include <list>

template<typename T>
void printType(const T& container)
{
    std::cout << "Container of " 
              << typeid(T).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: 
    printType(intVec);     //Container of St6vectorIiSaIiEE elements
    printType(doubleList); //Container of St4listIdSaIdEE elements
    printType(boolArr);    //Container of A5_b elements
}

還有第二個問題:為什么結果不同? 這是什么額外信息?

非常感謝你。

2個主要區別:

  1. 書籍版本獲取容器中元素的類型,而您的版本僅打印容器的類型。 另外,您的版本可以接受任何類型,即使它不是容器。 例如,在本書的版本中,類型為int而在您的版本中,類型為std::vector<int>

  2. 書籍版本“獲取”類型。 這可以進一步用於定義其他類型。 您的版本會打印信息。 除了打印,您無能為力。 您不能使用它來組合其他類型或聲明變量。

    就像之間的區別:

     int max(int a, int b) { if (a > b) return a ; else return b; } 

     void print_max(int a, int b) { if (a > b) std::cout << a << '\\n'; else std::cout << b << '\\n'; } 

    第一個功能大大優於第二個功能。 您可以使用它來執行其他僅打印最大值的操作。 例如:

     int max(int a, int b, int c) { return max(a, max(b, c)); } 

    可以使用書籍版本但不能使用書籍版本的示例:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM