1

イテレータに特化する必要があるテンプレート関数があります。だから私がしたことは次のようなものでした:

template <typename T>
void function2(T whatever, typename std::iterator_traits<T>::pointer) // ... iterator

template <typename T>
void function2(T whatever, ...) // ... non-iterator

template <typename T>
void function(T whatever) {
    function2(whatever, NULL);
}

std::iterator_traitsそして、Microsoft標準ライブラリはすべての数値タイプ(、、、、…)に特化しているboolため、char壁にぶつかりましたintfloatそして、それらのタイプで呼び出すこともできないという事実にもかかわらず、それはでreferenceありpointer、ではありません。voidoperator*operator->

わかりました、いくつかのより複雑なテンプレート機構を犠牲にして、std::iterator_traits<T>::category派生物をチェックすることができますstd::input_iterator(実際には私の場合はより適切だと思います)。std::forward_iterator

しかし、私は知りたいと思います:

  • イテレータの概念に準拠していない型を定義するのはなぜですかiterator_traits(出力イテレータでさえ少なくとも単項が必要ですがoperator*、これらの型のいずれにも単項がありません。
  • そうすることでC++仕様に違反していますか?マイクロソフトがいたるところで違反しているわけではありませんが、違反している場合は、明らかに違反していなければ、コンパイラ固有の回避策に満足します。
  • そして、それはとにかく一般的にさえ実行可能ですか?常に存在しているように見えますstd::iterator_traits<T>::pointerが、定義されていないため、SFINAEではなくエラーが発生します。
4

1 に答える 1