Skip to content

Instantly share code, notes, and snippets.

@athre0z
Created May 17, 2015 23:59
Show Gist options
  • Save athre0z/39193df1dd633ebb7f61 to your computer and use it in GitHub Desktop.
Save athre0z/39193df1dd633ebb7f61 to your computer and use it in GitHub Desktop.
template<typename WrapperT, typename WrappedT>
struct Proxy {
virtual WrappedT& valueRef() = 0;
virtual const WrappedT& valueCRef() const = 0;
virtual ~Proxy() = default;
};
template<typename WrapperT, typename WrappedT>
struct Add {
template<typename RhsT>
friend auto operator + (const Proxy<WrapperT, WrappedT>& lhs, const RhsT& rhs)
-> decltype(lhs.valueCRef() + rhs) {
return lhs.valueCRef() + rhs;
}
};
template<typename T>
struct Wrapper
: Proxy<Wrapper<T>, T>
, Add<Wrapper<T>, T> {
T& valueRef() override { return val; }
const T& valueCRef() const override { return val; }
operator T& () { return valueRef(); }
operator const T& () const { return valueCRef(); }
private:
T val;
};
int main() {
Wrapper<int> a;
(void)(a + a);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment