#include <iostream>
#include <type_traits>
template <class F, class G, class ... Args>
auto static_if (std::true_type, F && f, G && g, Args && ... args) {
return std::forward<F> (f) (std::forward<Args>(args)...);
}
template <class F, class G, class ... Args>
auto static_if (std::false_type, F && f, G && g, Args && ... args) {
return std::forward<G> (g) (std::forward<Args>(args)...);
}
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 x) { std::cout << *x << std::endl; },
[] (auto x) { std::cout << "no pointer" << std::endl; },
x
);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp0ZW1wbGF0ZSA8Y2xhc3MgRiwgY2xhc3MgRywgY2xhc3MgLi4uIEFyZ3M+CmF1dG8gc3RhdGljX2lmIChzdGQ6OnRydWVfdHlwZSwgRiAmJiBmLCBHICYmIGcsIEFyZ3MgJiYgLi4uIGFyZ3MpIHsKCXJldHVybiBzdGQ6OmZvcndhcmQ8Rj4gKGYpIChzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOwp9CQoJCnRlbXBsYXRlIDxjbGFzcyBGLCBjbGFzcyBHLCBjbGFzcyAuLi4gQXJncz4KYXV0byBzdGF0aWNfaWYgKHN0ZDo6ZmFsc2VfdHlwZSwgRiAmJiBmLCBHICYmIGcsIEFyZ3MgJiYgLi4uIGFyZ3MpIHsKCXJldHVybiBzdGQ6OmZvcndhcmQ8Rz4gKGcpIChzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOwp9CgoKdGVtcGxhdGUgPGNsYXNzIFQ+IHN0ZDo6dHJ1ZV90eXBlIGNvbnN0ZXhwciBpc19wb2ludGVyIChUICopIHsgcmV0dXJuIHt9OyB9CnRlbXBsYXRlIDxjbGFzcyBUPiBzdGQ6OmZhbHNlX3R5cGUgY29uc3RleHByIGlzX3BvaW50ZXIgKFQpIHsgcmV0dXJuIHt9OyB9CgppbnQgbWFpbigpIHsKCWludCB4ID0gNTsKCXN0YXRpY19pZiAoCgkJaXNfcG9pbnRlciAoeCksCgkgICAgW10gKGF1dG8geCkgeyBzdGQ6OmNvdXQgPDwgKnggPDwgc3RkOjplbmRsOyB9LAoJICAgIFtdIChhdXRvIHgpIHsgc3RkOjpjb3V0IDw8ICJubyBwb2ludGVyIiA8PCBzdGQ6OmVuZGw7IH0sCgkgICAgeAoJKTsKCXJldHVybiAwOwp9