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