#include <iostream>
#include <type_traits>
template <class F, class G>
auto static_if (std::true_type, F && f, G && g) {
return std::forward<F> (f) (0);
}
template <class F, class G>
auto static_if (std::false_type, F && f, G && g) {
return std::forward<G> (g) (0);
}
template <class T> std::true_type constexpr is_pointer (T *) { return {}; }
template <class T> std::false_type constexpr is_pointer (T) { return {}; }
int main() {
int x = 5;
static_if (
is_pointer (x),
[&] (auto) { auto y = x; std::cout << *y << std::endl; },
[&] (auto) { std::cout << "no pointer" << std::endl; }
);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp0ZW1wbGF0ZSA8Y2xhc3MgRiwgY2xhc3MgRz4KYXV0byBzdGF0aWNfaWYgKHN0ZDo6dHJ1ZV90eXBlLCBGICYmIGYsIEcgJiYgZykgewoJcmV0dXJuIHN0ZDo6Zm9yd2FyZDxGPiAoZikgKDApOwp9CQoJCnRlbXBsYXRlIDxjbGFzcyBGLCBjbGFzcyBHPgphdXRvIHN0YXRpY19pZiAoc3RkOjpmYWxzZV90eXBlLCBGICYmIGYsIEcgJiYgZykgewoJcmV0dXJuIHN0ZDo6Zm9yd2FyZDxHPiAoZykgKDApOwp9CgoKdGVtcGxhdGUgPGNsYXNzIFQ+IHN0ZDo6dHJ1ZV90eXBlIGNvbnN0ZXhwciBpc19wb2ludGVyIChUICopIHsgcmV0dXJuIHt9OyB9CnRlbXBsYXRlIDxjbGFzcyBUPiBzdGQ6OmZhbHNlX3R5cGUgY29uc3RleHByIGlzX3BvaW50ZXIgKFQpIHsgcmV0dXJuIHt9OyB9CgppbnQgbWFpbigpIHsKCWludCB4ID0gNTsKCXN0YXRpY19pZiAoCgkJaXNfcG9pbnRlciAoeCksCgkgICAgWyZdIChhdXRvKSB7IGF1dG8geSA9IHg7IHN0ZDo6Y291dCA8PCAqeSA8PCBzdGQ6OmVuZGw7IH0sCgkgICAgWyZdIChhdXRvKSB7IHN0ZDo6Y291dCA8PCAibm8gcG9pbnRlciIgPDwgc3RkOjplbmRsOyB9CgkpOwoJcmV0dXJuIDA7Cn0=