簡體   English   中英

為什么這不是功能模板的部分專業化?

[英]Why is this not a partial specialization of a function template?

讓我們考慮以下代碼:

template<typename T>
void func(T);
template<typename T>
void func(T*); // an overload

我知道第二個聲明是重載,而不是部分專業化:

template<typename T>
void func<T*>(T*); // not allowed by C++ standard

但是我想知道它與部分專業化有何不同? 它為我們提供了與部分專業化所提供的功能相同的功能,不是嗎?

但是我想知道它與部分專業化有何不同?

區別在於它不是專業。 模板專業化是主要模板的替代實現,在提供某些模板參數時使用。 當您將一組參數應用於代碼中的模板名稱時,這將導致編譯器調用模板實例化機制。 其中一部分是檢查主模板的顯式專業化,並在它們與那些參數匹配時使用它們。

函數重載不會發生。 而是使用了過載解析機。

實現相同目的的不同方法。

如果您需要詳細信息,則功能不只是名稱。 它是一個名稱及其簽名。 因此,具有相同名稱但簽名不同的功能就是不同的功能。 因此,該行未聲明相同模板函數的專業化; 它聲明了一個新的主模板。

它為我們提供了與部分專業化所提供的功能相同的功能,不是嗎?

在某些情況下,部分專業化可以比重載更方便地做一些事情,但這些情況可能基於SFINAE或其他元編程技巧。 是的,部分專業化可以完成重載的大部分工作。

但是,無論是否存在函數部分專業化,您仍然需要重載規則。 對於非模板情況以及可以用非模板版本重載模板函數的情況,您需要這些規則。 或者具有比主模板更多或更少的參數。 您需要能夠擁有一些構造器,它們是模板,而有些則不是。

因此,無論如何,都有關於模板函數如何重載的規則。

因此,更好地表達您的意思是,函數重載很大程度上會使函數部分專業化成為多余的 (這可能就是為什么它不存在的原因)。 甚至更好的是,類模板的部分專業化是一種為類模板提供類似於函數的重載功能的方法。

暫無
暫無

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

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