イテレータに特化する必要があるテンプレート関数があります。だから私がしたことは次のようなものでした:
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
壁にぶつかりましたint
。float
そして、それらのタイプで呼び出すこともできないという事実にもかかわらず、それはでreference
ありpointer
、ではありません。void
operator*
operator->
わかりました、いくつかのより複雑なテンプレート機構を犠牲にして、std::iterator_traits<T>::category
派生物をチェックすることができますstd::input_iterator
(実際には私の場合はより適切だと思います)。std::forward_iterator
しかし、私は知りたいと思います:
- イテレータの概念に準拠していない型を定義するのはなぜですか
iterator_traits
(出力イテレータでさえ少なくとも単項が必要ですがoperator*
、これらの型のいずれにも単項がありません。 - そうすることでC++仕様に違反していますか?マイクロソフトがいたるところで違反しているわけではありませんが、違反している場合は、明らかに違反していなければ、コンパイラ固有の回避策に満足します。
- そして、それはとにかく一般的にさえ実行可能ですか?常に存在しているように見えます
std::iterator_traits<T>::pointer
が、定義されていないため、SFINAEではなくエラーが発生します。