我试图扩展Can I use decltype (or something similar) for explicit template instantiation without signature duplication?以使用模板化成员函数,但我没有运气。目前尝试进行此项工作的方式如下:
// header
struct my_class
{
template <typename T>
some_type my_func(T val);
};
//source
template <typename T>
some_type my_class::my_func(T val)
{
....
}
// attempt a
template decltype(my_class::my_func<int>) my_class::my_func<int>;
// attempt b
template std::remove_pointer<decltype(&my_class::my_func<int>)>::type my_class::my_func<int>;
这可能吗?如果是这样,关于如何使这项工作的任何想法?
编辑:
因此看起来这需要一些仅在clang或gcc 6.1+中可用的编译器更新。 @yakk提供的以下代码适用于const方法:
template <class T>
struct pointer_to_member_function{};
template <typename pmf_t>
using pointer_to_member_signature
= typename pointer_to_member_function<pmf_t>::signature;
template <class ret_t, class class_t, class...args>
struct pointer_to_member_function<ret_t(class_t::*)(args...) const>
{
using signature = ret_t(args...) const;
};
但是,以下修改确实在所有常量中编译:
template <class function_t, class class_t>
struct pointer_to_member_function<function_t class_t::*>
{
using signature = function_t;
};
答案 0 :(得分:1)
我不知道这是否符合标准,但它适用于clang:
template<class Pmf>
struct pmf_sig{};
template<class Pmf>
using pmf_sig_t=typename pmf_sig<Pmf>::type;
template<class R, class T, class...Args>
struct pmf_sig<R(T::*)(Args...)>{
using type=R(Args...);
};
然后const
和const&
以及&&
支持:
template<class R, class T, class...Args>
struct pmf_sig<R(T::*)(Args...) const>{
using type=R(Args...) const;
};
template<class R, class T, class...Args>
struct pmf_sig<R(T::*)(Args...) const&>{
using type=R(Args...) const&;
};
template<class R, class T, class...Args>
struct pmf_sig<R(T::*)(Args...) const&&>{
using type=R(Args...) const&&;
};
template<class R, class T, class...Args>
struct pmf_sig<R(T::*)(Args...) &&>{
using type=R(Args...) &&;
};
template<class R, class T, class...Args>
struct pmf_sig<R(T::*)(Args...) &>{
using type=R(Args...) &;
};
使用:
template<> pmf_sig_t<decltype(&my_class::my_func<int>)> my_class::my_func<int>;
或者:
template pmf_sig_t<decltype(&my_class::my_func<int>)> my_class::my_func<int>;
这个想法是my_class::
在某种意义上不是签名的一部分。