いくつかのSTLの実装は、実際にアルゴリズムを実装するオブジェクトのスライスを使用します。 例えば、iterator_tags を使用して、簡単にstd::advance
が最も効率的なアルゴリズムを使用することができます。それ以外の場合はあいまいな
あなたは明確にすることができ、独自の小さなクラス階層を使用して
namespace std {
template <class I>
void advance_impl(I& it, int n, input_iterator_tag) {
for (; n > 0; --n)
++it;
}
// Forward Iterators use the same implementation as Input Iterators...
// TODO:
// Add bidirectional_iterator_tag implementation...
template <class I>
void advance_impl(I& it, int n, random_access_iterator_tag) {
it += n;
}
template <class I>
void advance(I& it, int n) {
advance_impl(it, n, typename iterator_traits<I>::iterator_category());
}
} // std
を関数のオーバーロード。例えば。オブジェクトをstd::string
に変換するには、オブジェクトメンバ関数to_string()
(存在する場合)を使用するか、そうでない場合はoperator<<
を使用します。
struct R2 {}; // rank 2
struct R1 : R2 {}; // rank 1
// C++11.
// Use some type traits and enable_if in C++03.
template <class T>
auto ToString(R1, T const& t) -> decltype(t.to_string()) {
return t.to_string();
}
template <class T>
std::string ToString(R2, T const& t) {
std::ostringstream s;
s << t;
return s.str();
}
template <class T>
std::string ToString(T const& t) {
return ToString(R1(), t);
}
可能な重複: http://stackoverflow.com/questions/2389125/object-slicing-is-it-advantage – shivakumar
@shivakumarおかげで、素敵な発見。しかし、答えの例が構成されています。誰かが実世界の例を考え出すことを望んだ。 – jrok