【问题标题】:Passing functions to a class [closed]将函数传递给类[关闭]
【发布时间】:2016-12-28 16:11:16
【问题描述】:

假设我有这个类:

template<class K, class func1, class func2>
class findMax {
    K* key;
    func1 cmp;
    func2 areSame;
};

template<class K, class func1, class func2>
findMax<K, func1, func2>::findMax(K n, func1 isValid, func2 areSameFunc) {

    cmp = isValid;
    areSame = areSameFunc;
} 

如何创建此类的实例?
我试过了:

typedef bool (*someFunc)(int);
typedef bool (*someFunc2)(int, int);

findMax<int, someFunc, someFunc2> u(7, isValid, areSame); // Doesn't compile, error below.

错误信息:

Invalid arguments '
Candidates are:
 findMax(const findMax<int,bool (*)(int, int),bool (*)(int)> &)
 findMax()
 findMax(int, #10000, ?, ?)
'

地点:

bool isValid (int k) {
    return (k>0);
}

bool areSame (int key, int key2) {
    return key==key2;
}

但这不起作用。我也尝试了其他方法,但找不到如何做到这一点。
那我该怎么做呢?

【问题讨论】:

  • 什么不起作用?
  • @Carcigenicate 抱歉,已添加。
  • @SomeoneWithAQuestion 使用 std::function 和 c++ 代码。
  • @SomeoneWithAQuestion // Doesn't compile 信息量不大。在您的问题中发布 minimal reproducible example 和逐字错误消息。
  • 您定义了构造函数,但您从未在类中声明它...

标签: c++ class templates


【解决方案1】:

你需要整理你的构造函数声明/定义,可能还有你的成员声明(它可能应该是一个值而不是一个指针)。这样就可以直接创建对象了。

就个人而言,我实际上不会同时指定模板参数,而是创建一个合适的工厂函数。例如:

template<typename K, typename Fun1, typename Fun2>
class findMax {
    K     key;
    Fun1 cmp;
    Fun2  areSame;
public:
    findMax(K n, Fun1 isValid, Fun2 areSameFunc)
        : key(n)
        , cmp(isValid)
        , areSame(areSameFunc) {
    }
};

template<typename K, typename Fun1, typename Fun2>
findMax<K, Fun1, Fun2> makeFindMax(K n, Fun1 fun1, Fun2 fun2) {
    return findMax<K, Fun1, Fun2>(n, fun1, fun2);
}

bool isValid (int k) {
    return (k>0);
}

bool areSame (int key, int key2) {
    return key==key2;
}

int main() {
    auto obj = makeFindMax(7, isValid, areSame);
}

【讨论】:

  • 感谢您的回答。 findMax 实际上是在一个头文件中,而我发布的其余代码在源文件中。有没有一种方法可以做到这一点,而不必从我的源文件中调用另一个函数来创建一个新的findMax
  • @SomeoneWithAQuestion:在标头中声明工厂函数也没有错。然而,一旦你正确定义了你的构造函数,你就可以像在makeFindMax()中那样调用它。
猜你喜欢
  • 2020-06-29
  • 2021-04-13
  • 2020-10-10
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多