![](/img/trans.png)
[英]What is the advantage of using std::type_info::hash_code over std::type_index
[英]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個主要區別:
書籍版本獲取容器中元素的類型,而您的版本僅打印容器的類型。 另外,您的版本可以接受任何類型,即使它不是容器。 例如,在本書的版本中,類型為int
而在您的版本中,類型為std::vector<int>
。
書籍版本“獲取”類型。 這可以進一步用於定義其他類型。 您的版本會打印信息。 除了打印,您無能為力。 您不能使用它來組合其他類型或聲明變量。
就像之間的區別:
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.