C++模板——根据参数编译成员函数

C++ template - compile member function based on arguments

假设 class 有一个成员函数,它应该接受一个双精度(双精度)函数或一个 class 实例与 "MyStructFunc" public 成员函数作为一个参数:

#include<functional>
#include <type_traits>
struct Caller
{
    // (1.)
    double call(std::function<double(double)> func) { return func(1); }

    // (2.)
    template<typename T>
    double call(const T& S) { return S.MyStructFunc(2); }
};

因此,例如,我们可以通过

double myFunc(double x) { return x * x * x; }

struct myStruct
{
    double MyStructFunc(double x) const { return x * x; }
};

像这样:

int main()
{
    Caller c;
    myStruct ms;
    c.call(myFunc);
    c.call(ms);
}

不幸的是,我得到一个错误。你能帮我让它工作吗?感谢您的帮助!

函数指针不是 std::function,因此您的模板方法更匹配。

您可以使用 SFINAE 来限制您的模板方法:

// (2.)
    template<typename T>
    auto call(const T& S) -> decltype(S.MyStructFunc(2)) { return S.MyStructFunc(2); }

Demo