簡體   English   中英

&*表示原始指針,迭代器和…std :: nullptr_t

[英]&* 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.

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