gpt4 book ai didi

c++ - 使用带有宏的 decltype 显式实例化类成员函数

转载 作者:行者123 更新时间:2023-11-30 05:20:00 25 4
gpt4 key购买 nike

我正在尝试扩展 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;
};

但是,以下修改会在所有 const-ness 中编译:

template <class function_t, class class_t>                                                                                                                               
struct pointer_to_member_function<function_t class_t::*>
{
using signature = function_t;
};

最佳答案

我不知道这是否符合标准,但它适用于 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...);
};

然后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 .

关于c++ - 使用带有宏的 decltype 显式实例化类成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40880132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com