首页 > 解决方案 > 函数采用指向方法的指针,而不考虑 constness

问题描述

我想实现一个通用函数,它将引用对象和指向其成员函数的指针并调用它。但是,当我的类同时具有 const 和非 const 方法时,我无法这样做,因为我需要提供两个重载:

template<typename Ret, typename Class, typename ...Us>
Ret callMethod(Class &object, Ret (Class::*method)(Us...))
{
    return (object.*method)(Us{}...);
}

template<typename Ret, typename Class, typename ...Us>
Ret callMethod(Class &object, Ret (Class::*method)(Us...) const)
{
    return (object.*method)(Us{}...);
}

有什么方法可以只编写 1 个模板函数来接受 const 和非 const 方法指针,这样我就不必编写两次代码了?我正在使用 C++14。

从更广泛的角度来看,我最终想要实现的是传递第三个参数,一个数据缓冲区,将从中提取方法参数 - 因此模板函数尽可能通用地处理它。

标签: c++templatesc++14

解决方案


简短的回答是,不要自己实现,它已经以以下形式为您完成std::invoke

#include <functional>

struct A {
    void foo(int x);
    void bar(int x) const;
};

void example() {
    A a;
    std::invoke(&A::foo, a, 3); 
    std::invoke(&A::bar, a, 3); 
}

回想起来,您已经添加了一个 C++14 标记,文档中std::invoke有一个示例实现,您可以在您的项目中使用它。


推荐阅读