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
によって提供されるので、私はここにそれらを綴るとき、私は単に呼び出しを転送するので、質問です。
変換演算子をオーバーロードしますか? – StoryTeller
良い質問ですが、あなたのポストにサンプルコードの関連部分を埋め込んだ方が簡単です。 – ryyker
これは、ドット演算子のオーバーロードの大まかな使用例ですが、少なくともC++の後の方言でなければC++にはなりません。これは単純な 'int'ラッパーであることを考えると、おそらく' BOOST_STRONG_TYPEDEF'が助けてくれるかもしれませんが、最後に私は覚えています。 – chris