2016-11-30 50 views
1

我試圖擴展Can I use decltype (or something similar) for explicit template instantiation without signature duplication?以使用模板成員函數,但我沒有運氣。目前嘗試使這項工作看起來像:使用帶有宏的decltype用於類成員函數的顯式實例化

// 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>; 

這可能嗎?如果是這樣,關於我如何能做到這一點的任何想法?

編輯:

所以看來這僅需要在鐺或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;                                    
};    

回答

1

我不知道這是否符合標準,但它在鐺:

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...); 
}; 

然後constconst&&&支持:

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::是不是在某種意義上簽名的一部分。

live example

+0

這適用於非const成員函數,但在const限定時崩潰。我沒有與const專業化運氣。想法? – mgoldman

+0

@mgoldman已更新 – Yakk

+0

它似乎只適用於clang和gcc 6.1+?對於較小的gcc版本,這裏缺少什麼語言要求?請參閱https://godbolt.org/g/kWWP7p – mgoldman

相關問題