gpt4 book ai didi

c++ - 如何将函数回调传递给类成员?

转载 作者:行者123 更新时间:2023-11-30 04:31:37 26 4
gpt4 key购买 nike

我正在模板化一个队列类,这样我就可以将它用于从整数到我需要定义的任何结构的任何东西。

我需要将一个比较函数传递给类构造函数,一个预定义的整数比较函数,然后将其留给客户提供他们可能需要的任何比较函数。但我该怎么做呢?

template<typename Type>
int cmpFn(Type one, Type two)
{
if (one < two) return -1;
if (one > two) return 1;
return 0;
}

template <typename Type>
class Queue
{
public:
Queue()
{
Type *list = new Type[size];
// What do I do now?
// How to define this constructor?
// It must pass a comparison function
// to a private sort method in this class.
}
private:
void sortFunc(Type list, int(fn)(Type one, Type two)=cmpFn);
};

上面的代码可能有一些错误,因为我只是从头开始写下来以使我的问题更清楚。但我感兴趣的是如何在定义类时将比较函数传递给排序方法。

这是个人练习,我没有参加任何类(class),也没有接触过任何导师。我已经用谷歌搜索了一段时间,但我找不到正确的答案……我想我没有向谷歌先生提出正确的问题。

附言客户端可能希望为任何类型的数据提供比较功能,例如:

struct individual
{
string name;
int age;
double height;
};

我猜构造函数必须是这样的:

Queue(int (*fn)(Type, Type) = cmpFn);

但是我该如何定义/实现它呢?使用这个回调函数的不是Queue对象本身,而是它的方法:sort();

最佳答案

这是我认为您想要的一个有效的、可编译的示例:

#include <cstddef>
#include <string>
#include <iostream>

template<typename Type>
int cmpFn(Type one, Type two)
{
if (one < two) return -1;
if (one > two) return 1;
return 0;
}

template <typename Type>
class Queue
{
public:
// This is the typedef for your callback type
typedef int (*callback)(Type one, Type two);

Queue(Type *list, size_t size, callback func = cmpFn)
{
sortFunc(list, size, func); // works too
}

private:
void sortFunc(Type *list, size_t size, callback func) {
for (size_t i=0; i<size; i++) {
for (size_t j=0; j<size; j++) {
if (i == j) continue;

int val = (*func)(list[i], list[j]);
switch (val) {
case 1:
std::cout << list[i] << " is greater than " << list[j] << "\n";
break;
case -1:
std::cout << list[j] << " is greater than " << list[i] << "\n";
break;
case 0:
std::cout << list[i] << " and " << list[j] << " are equal\n";
break;
}
}
}
}

};

int stringCmp(std::string one, std::string two) {
if (one.size() < two.size()) return -1;
if (one.size() > two.size()) return 1;
return 0;
}

int main() {
// compare ints, use generic comparison function (cmpFn)
int myInts[2] = {1, 2};
Queue<int> qi(myInts, 2);

// compare strings, use our own comparison function (stringCmp)
std::string myStrings[2] = {"foo", "bar"};
Queue<std::string> qs(myStrings, 2, stringCmp);

return 0;
}

编译并执行上面的程序应该得到这样的输出:

2 is greater than 1
2 is greater than 1
foo and bar are equal
bar and foo are equal

基本上它做了什么:

  • Queue 构造函数接受一个list 数组、它的大小和一个回调函数。
  • 如果未提供回调函数,则使用通用回调函数 (cmpFn)。
  • 然后它调用 sortFunc,循环遍历 list 数组中的所有元素,并使用回调函数比较它们。

在上面的代码中,您有一个包含 intstd::string 的示例。

关于c++ - 如何将函数回调传递给类成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8126242/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com