答案是这个问题使用类模板挑选函数类型:
template <typename T>
struct function_args {};
template <typename R, typename... Args>
struct function_args<R(Args...)> {
using type = tuple<Args...>;
};
template <typename T>
using decltypeargs = typename function_args<T>::type;
当我研究这里所做的事情时,我尝试重写function_args
。我尝试使用函数来做到这一点,以便消除对decltypeargs
模板。但发现自己陷入了不正确的语法:
template <typename T>
tuple<> myTry();
template <typename Ret, typename... Args>
tuple<Args...> myTry<Ret(Args...)>();
使用函数,您可以重用之前的相同类型特征:
template <typename T>
function_args<T> myTry();
或者您可以使用函数重新实现相同的功能。您不能部分特化函数模板,但可以重载:
namespace detail {
template <class T> struct tag { };
template <class R, class... Args>
tag<std::tuple<R, Args...>> myTry(tag<R(Args...)> );
template <class R, class C, class... Args>
tag<std::tuple<R, Args...>> myTry(tag<R(C::*)(Args...)> );
// etc.
}
template <typename T>
auto myTry() { return detail::myTry(detail::tag<T>{}); }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)