2017-03-15 10 views
3

私はクラスがあります。例えば、vector<T>です。私は、それぞれT&const T&を返す2つのゲッターメソッドを実装したいと思います。私はそれらの両方を実装したくありません。代わりに、constバージョンのみを実装し、非constメソッドでそのコードをconst_castで再利用したいと思います。const-refゲッターのconst_castで参照ゲッターを実装する落とし穴

template<typename T> 
class Vector { 
public: 
    T& operator[](size_t i) { 
     return const_cast<T&>(
      static_cast<const Vector<T>*>(this)->operator[](i)); 
    } 

    const T& operator[](size_t i) const { 
     return data[i]; 
    } 

private: 
    T* data; 
}; 

このアプローチの落とし穴はありますか?または、const_castが正当なものであることを確認する方法はありますか?

最後に、このような複製されたconst/non-constコードを扱うよくある一般的な方法は何ですか?

+1

は、より多くの仕事と簡単に最後に二回 –

+0

* "演算子を実装するよりも悪いメンテナンス頭痛のように私には見えますそのような複製されたconst/non-constコードを扱う良い共通の方法は何ですか? "*すでによく尋ねられているので、十分に頻繁に答えています。 –

+1

[elegant-to-duplicate-const-and-non-const-getters]に関連する(http://stackoverflow.com/questions/856542/elegant-solution-to-duplicate-const-and-non-const) -getters) – Jarod42

答えて

5

一つのきれいな方法はthisのconst性を推測することができますプライベートテンプレート関数に委譲することです:

#include <cstdint> 

template<typename T> 
class Vector { 
public: 
    T& operator[](std::size_t i) { 
     return impl_indirection(this, i); 
    } 

    const T& operator[](std::size_t i) const { 
     return impl_indirection(this, i); 
    } 

private: 
    template<class MaybeConstVector> 
    static decltype(auto) impl_indirection(MaybeConstVector* pv, std::size_t index) 
    { 
    return pv->data[index]; 
    } 

    T* data; 
}; 
+0

その 'const 'のための組み込みがあったらいいですか? T&operator [](...)const?; '。 – YSC

関連する問題