函数作为具有默认值的参数
Function as argument with default value
我想为二叉树创建类:
struct TreeNode {
explicit TreeNode(int _value) : value(_value) {}
int value = 0;
TreeNode* left = nullptr;
TreeNode* right = nullptr;
};
class BTree {
public:
void Add(int value);
void PrintPostOrder(void (*func)() = print_current);
~BTree();
private:
TreeNode* root = nullptr;
void print_current();
void delete_node();
};
BTree::~BTree() {
PrintPostOrder(delete_node);
}
我的想法——对于析构函数和打印,我需要进行二进制树遍历。所以我想创建函数Traversal,并在其中使用function
作为参数:如果我需要打印CCD_ 2并且对于析构函数CCD_。
这里有错误:
void PrintPostOrder(void (*func)() = print_current);
类型为"void(BTree::((("的默认参数不兼容参数类型为"void((((">
当参数是函数时,我不知道如何设置参数的默认值
print_current
和delete_node
是成员函数,因此需要一个成员函数指针:
class BTree {
public:
void PostOrder(void (BTree::*fn)() = &BTree::print_current) {
std::invoke(fn, this);
}
~BTree() {
PostOrder(&BTree::delete_node);
}
private:
void print_current();
void delete_node();
};
为了获得更大的灵活性,您可以将PostOrder
作为模板:
struct TreeNode {};
class BTree {
public:
template<class Fn>
void PostOrder(Fn fn) {
std::invoke(fn);
}
void PostOrder() {
PostOrder([this] { print_current(); });
}
~BTree() {
TreeNode* node;
PostOrder([this, node] { delete_node(node); });
}
private:
void print_current();
void delete_node(TreeNode*);
};
原则上,您可以按照自己的方式为函数设置默认参数。问题是成员函数与自由函数的类型不同。
这是一个自由函数指针void (*func)()
,而print_current
是类型为void (BTree :: ) ()
的成员函数。
要么修复参数类型,要么使用一个自由函数作为默认参数。
另外,不要忘记成员函数与自由函数有根本的不同,因为您需要一个实例来调用它们。
相关文章:
- 当给定默认值时,为什么此模板参数推导失败
- 如何在C++中提供模板化函数作为另一个函数的参数,默认值?
- 在 c++ 中,如果我创建一个接受一个具有默认值的参数的构造函数 - 它会用作默认(空)构造函数吗?
- 为什么无法在可变参数模板中将尾随模板参数指定为默认值?
- 可变参数模板和具有继承的默认值
- 具有默认值的单个参数构造函数是否与默认构造函数相同?
- 在子类函数覆盖中省略具有默认值的参数
- 函数作为具有默认值的参数
- 具有另一个具有默认值的模板参数的模板推导
- const变量是否可以在具有默认值的参数中赋值(作为可选参数)
- 对 const 引用参数使用默认值会导致崩溃
- 为什么我需要将默认引用参数定义为 const 以便为其分配一个左值?
- 指针参数的默认值
- C++中出现意外的编译错误:将默认值传递给函数参数
- 我可以在哪里放置参数的默认值
- 如何在C++中设置std::list参数的默认值?
- 具有默认值的参数的自动类型扣除
- Clang vs GCC - 可变参数模板参数包后跟默认值参数在 GCC 4.8 中有效,但在 Clang 3.5 中无
- c++变长函数中默认值参数的位置
- 将函数指针上的参数与默认值参数一起丢弃是否有效