0

(std::enable_if を介して) 有効になっているテンプレート関数があります。そのパラメーターは生のポインターであるか、std::iterator カテゴリを持っているか、std::nullptr_t です。その関数では、次のように、生のポインター (データ メンバー) がパラメーターと等しく設定されます。

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

&* はポインターとイテレーターではうまく機能しますが、std::nullptr_t では失敗します。2つの異なる関数を書くことを避けるために利用できる解決策はありますか?

ありがとうございました。

4

2 に答える 2

5

最も簡単な方法は、関数を 2 つのオーバーロードを持つように変更することです。1 つnullptr_tは値を格納するだけの raw pointer/ 用で、もう 1 つは現在の実装のイテレータ用に SFINAE によって選択されたものですが、これは状況によっては失敗することに注意してください (特にiterator::value_typeunary をオーバーロードしoperator&ます)。

于 2012-08-31T17:25:40.423 に答える
2

いつものように、これはtraitで解決できます。今回は、単純な関数のオーバーロードで十分なので、完全なクラスは書きません。

#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

于 2012-08-31T17:25:31.937 に答える