【问题标题】:C++ template - compile member function based on argumentsC++ 模板 - 基于参数编译成员函数
【发布时间】:2019-11-15 21:44:05
【问题描述】:

假设一个类有一个成员函数,它应该接受一个 double(double) 函数或一个带有“MyStructFunc”公共成员函数作为参数的类实例:

#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);
}

很遗憾,我收到了一个错误。你能帮我让它工作吗?感谢您的帮助!

【问题讨论】:

  • 你得到什么错误,在哪一行? Edit你的问题包括这些细节。

标签: c++ templates c++14 typetraits


【解决方案1】:

函数指针不是std::function,所以你的模板方法更匹配。

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

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

Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 2017-02-22
    相关资源
    最近更新 更多