#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;
}