2016-06-28 3 views
0

intのような振る舞いをする演算子のすべてをオーバーロードすることなくintラッパークラスを持っています。同じ質問が尋ねられましたが、実際には答えられていませんhere。私は、テンプレートラッパーを作成し、それを達成するために数十の演算子をオーバーロードできることを知っています(実際には、今のように - basically it looks like this mess)。しかし、呼び出しを転送した演算子に過負荷をかけることなく、何らかの形で内部のプリミティブ型を公開することができればいいでしょう。すべての演算子をオーバーロードしないintラッパー

これは可能ですか?おそらく、逆参照演算子やsomesuchのオーバーロードによって?

EDIT:コード例:それはそれを検証して無効にするための便利なオプションを与えるよう

template<typename T> 

class IDWrapper 
{ 
public: 
    inline IDWrapper() { } 
    inline IDWrapper(T id) : m_Value(id) { } 

    constexpr static int size() { return sizeof(T); } 
    constexpr static T min() { return std::numeric_limits<T>::min(); } 
    constexpr static T max() { return std::numeric_limits<T>::max(); } 

    inline bool isValid() const { return m_Value != 0; } 
    inline operator T() const { return m_Value; } 
    inline operator T&() { return m_Value; } //this line was the attempt to make it transparent... unsuccessfully 
    inline IDWrapper &operator=(T v) { m_Value = v; return *this; } 
    inline void invalidate() { m_Value = 0; } 

private: 
    T m_Value = 0; 
}; 

基本的には「特別」な方法でタイプTのIDをラップします。さらに、サイズと最小/最大の便利なアクセスを提供します。テンプレート化されたラッパーの理由は、後でbase64番号やその他の非標準の数値型に置き換える必要があるため、一貫性を保つためにIDWrapperに依存するインターフェイスが必要です。数字の演算子はまだTによって提供されるので、私はここにそれらを綴るとき、私は単に呼び出しを転送するので、質問です。

+0

変換演算子をオーバーロードしますか? – StoryTeller

+0

良い質問ですが、あなたのポストにサンプルコードの関連部分を埋め込んだ方が簡単です。 – ryyker

+1

これは、ドット演算子のオーバーロードの大まかな使用例ですが、少なくともC++の後の方言でなければC++にはなりません。これは単純な 'int'ラッパーであることを考えると、おそらく' BOOST_STRONG_TYPEDEF'が助けてくれるかもしれませんが、最後に私は覚えています。 – chris

答えて

0

だから私はOPのコメントに触発され、これら二つを持つ(とのみこれら2)オーバーロードされた演算子がトリックを行うことができますようだそれをいじっています

operator T&() { /*...*/ } 
operator const T&() const { /*...*/ } 

当然それがないわけではありませんコスト。たとえばTint(またはsizeof(T) < sizeof(void*)のいずれかのタイプ)の場合、そのオブジェクトへのconst参照はコピーを作成するよりも高価です(ただし、コピー演算子を使用すると透明性が損なわれます)。メモリアドレス検索はもちろんのこと、私はこれについての他の潜在的な問題については確信が持てませんので、自由にコメント/答えてください。しかし、これは動作します。

+0

"作品"を定義する。あなたは何をしたいですか?あなたのテストケースは何ですか? –

+0

@ KarolyHorvath Tのラッパークラスをサポートしたいので、すべての演算子をオーバーロードしないでください(Tに渡すだけです)。しかし、これらの演算子の実行はラップされた型で直接実行されます。説明はOPですが、基本的にTの上にいくつかのカスタム/便利なメソッドを追加したいのですが、それ以外の場合はTの動作をします。そして、プリミティブ型から継承できないので、ラッパーが答えです。 – Resurrection

+1

例:2つのIDWrappersを追加した結果はどうなりますか? –

関連する問題