Garciat
7/13/2017 - 10:24 PM

wrap_wrap.cpp

#include <type_traits>

template <typename T>
struct wrap;

template <typename T>
constexpr auto is_wrap_v = false;

template <typename T>
constexpr auto is_wrap_v<wrap<T>> = true;

template <typename T>
struct wrap {
    auto operator->() {
        if constexpr (is_wrap_v<T>) {
            return value.operator->();
        } else {
            return &value;
        }
    }

    T value;
};

struct vec2 {
  float x, y;
};

auto hello(wrap<wrap<wrap<vec2>>> w) {
    return w->x + w->y;
}