你要找的是
constexpr if
. 这样你就可以像
template<typename Obj>
void run(Obj o)
{
if constexpr (std::is_function_v<std::remove_pointer_t<Obj>>)
o();
else
o.print();
}
Live Example
如果你没有访问C++ 17但确实有C++ 14,那么你至少可以缩短你需要用Ac++编写的代码。
variable template
. 看起来像是
template<typename T>
static constexpr bool is_function_v = std::is_function< typename std::remove_pointer<T>::type >::value;
template<typename Function>
typename std::enable_if< is_function_v<Function>, void>::type
run(Function f)
{
f();
}
template<typename T>
typename std::enable_if< !is_function_v<T>, void>::type
run(T& t)
{
t.print();
}
Live Example