[英]&* for raw pointer, iterator and … std::nullptr_t
我有一個啟用了模板功能(通過std :: enable_if),其參數是原始指針,或者具有std :: iterator類別,或者是std :: nullptr_t。 在該函數中,將原始指針(數據成員)設置為等於參數,如下所示:
template<class T> void myFunction(T it)
{
_ptr = &*it;
}
&*對於指針和迭代器效果很好...但是對於std :: nullptr_t則失敗。 有沒有可用的解決方案來避免編寫2個不同的函數?
謝謝。
最簡單的方法是將函數更改為具有兩個重載,一個重載僅用於存儲指針的原始指針/ nullptr_t
,另一個重載由SFINAE為當前實現的迭代器選擇,盡管您應注意,這在某些情況下會失敗(特別是如果iterator::value_type
重載一元運算operator&
)。
和往常一樣,我們可以用特質來解決這個問題。 這次,我們不要編寫完整的類,因為簡單的函數重載就足夠了。
#include <cstddef>
#include <memory>
template <typename T>
T get_addr(T t) { return std::addressof(*t); } // #1
std::nullptr_t get_addr(std::nullptr_t np) { return np; }
用法:
T _ptr = get_addr(it);
(如果T
指向的類型重載operator&
則此特征也適用。)
邀請您使用與主模板相同的enable_if
條件來保護過載#1
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.