Typedef指向cv和/或ref限定成员函数的指针

时间:2016-03-17 20:32:54

标签: c++ templates function-pointers c++14 member-function-pointers

struct foo {
    void bar(int&&) && { }
};

template<class T>
using bar_t = void (std::decay_t<T>::*)(int&&) /* add && if T is an rvalue reference */;

int main()
{
    using other_t = void (foo::*)(int&&) &&;
    static_assert(std::is_same<bar_t<foo&&>, other_t>::value, "not the same");

    return 0;
}

我想要那个

    如果bar_t<T> ,则
  • void (foo::*)(int&&)会产生T = foo 如果bar_t<T>
  • ,则
  • void (foo::*)(int&&) const会产生T = foo const 如果bar_t<T>
  • ,则
  • void (foo::*)(int&&) &会产生T = foo& 如果bar_t<T>
  • ,则
  • void (foo::*)(int&&) const&会产生T = foo const&

等等。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

这应该做的工作:

template <typename, typename T> struct add {using type = T;};
template <typename F, typename C, typename R, typename... Args>
struct add<F const, R (C::*)(Args...)> {using type = R (C::*)(Args...) const;};

template <typename F, typename C, typename R, typename... Args>
struct add<F&, R (C::*)(Args...)> :
  std::conditional<std::is_const<F>{}, R (C::*)(Args...) const&,
                                       R (C::*)(Args...) &> {};
template <typename F, typename C, typename R, typename... Args>
struct add<F&&, R (C::*)(Args...)> :
  std::conditional<std::is_const<F>{}, R (C::*)(Args...) const&&,
                                       R (C::*)(Args...) &&> {};

Demo。请注意,F的基础类型将被忽略。