c++ - 推导出指向成员函数模板参数的指针的参数类型

标签 c++ templates c++17 pointer-to-member

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

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

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

最佳答案

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

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 .

关于c++ - 推导出指向成员函数模板参数的指针的参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66869212/

相关文章:

c++ - C++ 中的并发 TCP 服务器

c++ - 构造函数调用返回语句

c++ - decltype(1, t) 应该是左值引用吗? (编译器不同意)

c++ - 使用 C++ 连接到 MS Access

c++ - 如何使用 MSM boost 库运行同一个子状态机的多个实例

c++ - 当我将构造函数声明为显式时出现编译错误

python - 如何在 Jinja2 中包含具有相对路径的模板

python - 如何测试 Pyramid Chameleon 模板?

c++ - 将 vector 迭代器传递给模板函数

c++ - 如何通过可变参数模板将多个构造函数参数转发到数组初始值设定项列表?