【问题标题】:Deduce parameter type of pointer to member function template parameter推断成员函数模板参数的指针的参数类型
【发布时间】:2021-03-30 10:27:27
【问题描述】:

我正在尝试编写一个 C++ 函数模板f,其中一个模板参数类型为void (Foo::*FUNC)(T const *),其中Foo 是某种类类型。此外,我想从为FUNC 指定的具体成员函数指针中推导出T。所以一个想法是:

template<typename T, void(Foo::*FUNC)(T const *)>
void f()
{ /* use T in here, e.g. if constexpr (std::is_same_v<T, int>) */ }

但是我必须在实例化 f 时明确指定 T 并且不能只写例如f&lt;&amp;Foo::bar&gt;。我知道有一些方法可以推断出函数的第一个参数的类型,但它们都过于复杂(不使用 Boost)。有没有更聪明的方法来做我想做的事?

【问题讨论】:

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


    【解决方案1】:

    这是从成员函数指针中提取参数的特征,看起来像您期望的那样:

    namespace detail {
        template<typename M> struct extract_arg;
        template<typename R, class C, typename A>
        struct extract_arg<R (C::*)(A const*)> { using type = A; }
    }
    

    这是一个 C++17 函数模板,它带有一个非类型模板参数,其类型是从占位符推导出来的:

    template<auto FUNC>
    void f()
    {
        static_assert(std::is_member_function_pointer_v<decltype(FUNC)>);
        using T = typename detail::extract_arg<decltype(FUNC)>::type;
        T t{};
    }
    

    它使用std::is_member_function_pointer 来检查它确实是正确的类型(嗯,类型族),然后我们的辅助特征提取T

    See it live.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-27
      相关资源
      最近更新 更多