2012-08-31 34 views
0

我有一個模板函數啓用(通過std :: enable_if)其參數是一個原始指針,或有一個std :: iterator類別或是一個std :: nullptr_t。在該功能中,原始指針(數據成員)被設定等於參數,像:&*爲原始指針,迭代器和... std :: nullptr_t

template<class T> void myFunction(T it) 
{ 
    _ptr = &*it; 
} 

的& *行之有效的指針和迭代器......但它不能爲一個std :: nullptr_t 。是否有任何解決方案可以避免編寫2個不同的功能?

謝謝。

+0

即使'* it'類型已經重載'operator&',即使'&* it'也不會工作。 – Nawaz

回答

5

最簡單的事情是改變函數有兩個重載,一個用於原始指針/ nullptr_t,它只存儲SFINAE爲當前實現的迭代器選擇的值和一個值,儘管您應該注意到這會在某些情況下失敗情況(特別是如果iterator::value_type過載一元operator&)。

2

一如往常,我們可以用的特性來解決這個問題。這一次,我們不要寫一個完整的類,因爲一個簡單的函數重載就足夠了。

#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&

你被邀請看守過載#1具有相同enable_if條件你在主模板中有。

+0

「一如既往,一個特質 - 這一次」< - 這是應該給我的,抱歉不明白 –

+0

你最好也做一個特殊的指針情況,以防止取消引用不指向有效的指針。 'template T * get_addr(T * t){return t;}' – orlp

+0

@nightcracker:我假設OP只會在enable-if'ed函數中使用它。否則,你當然是對的。 –