函数作为默认值的参数

问题描述 投票:1回答:2

我想为二叉树创建类:

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作为参数:如果我需要打印func = print和析构函数func = delete_node

错误在这里:

void PrintPostOrder(void (*func)() = print_current);

类型为“ void(BTree :: )()”的默认参数不兼容参数类型为“ void()()”

[参数为函数时,我不知道如何设置参数的默认值。

c++ function-pointers
2个回答
2
投票

[print_currentdelete_node是成员函数,因此您需要成员函数指针:

class BTree {
    public:
        void PostOrder(void (BTree::*func)() = &BTree::print_current);
        ~BTree();

    private:
        void print_current();
        void delete_node();
};

BTree::~BTree() {
    PostOrder(&BTree::delete_node);
}

为了获得更大的灵活性,您可以将PostOrder用作模板:

struct TreeNode {};

class BTree {
    public:
        template<class Fn>
        void PostOrder(Fn fn) { fn(); }

        void PostOrder() {
            PostOrder([this] { print_current(); });
        }

        ~BTree();

    private:
        void print_current();
        void delete_node(TreeNode*);
};

BTree::~BTree() {
    TreeNode* node;
    PostOrder([this, node] { delete_node(node); });
}

3
投票

原则上,您按照自己的方式为函数设置默认参数。问题在于成员函数的类型与自由函数的类型不同。

这是一个自由函数指针void (*func)(),而print_current是类型void (BTree :: ) ()的成员函数。

要么固定参数类型,要么将自由函数用作默认参数。

也不要忘记成员函数与自由函数在本质上是不同的,因为您需要一个实例来调用它们。

© www.soinside.com 2019 - 2024. All rights reserved.