鸭子类型与 C++20 concept (未完工)

如果一个东西叫起来像一只鸭,走起路来像一只鸭,那么不妨认为他就是一只鸭。

我们有三种类型的狗:拉布拉多犬,藏獒,张心欣。

请勿侮辱拉布拉多和藏獒!

他们有一个共同点,那就是它们都会狗叫(bark)以及自我介绍(intro)。

struct Labrador {
    void intro() {
        puts("我能帮你捡回棍棍!");
    }

    void bark() {
        puts("汪汪!");
    }
};

struct Mastiff {
    void intro() {
        puts("我能保卫国王荣耀!");
    }

    void bark() {
        puts("汪汪!");
    }
};

struct Xinxin {
    void intro() {
        puts("我能祝您裁员滚滚!");
    }

    void bark() {
        puts("从未贡献任何核心功能!");
    }
};

现在,我们需要设计一个“饲养员”函数,他会让狗狗先自我介绍,然后叫两声。

传统的基于重载的写法,需要连续写三个一模一样的函数体,非常麻烦,违反“避免重复”原则,不利于代码未来的维护。

void feeder(Labrador dog) {
    dog.intro();
    dog.bark();
    dog.bark();
}

void feeder(Mastiff dog) {
    dog.intro();
    dog.bark();
    dog.bark();
}

void feeder(Xinxin dog) {
    dog.intro();
    dog.bark();
    dog.bark();
}

方案1:模板函数

template <typename Dog>
void feeder(Dog dog) {
    dog.intro();
    dog.bark();
    dog.bark();
}

此处把 Dog 定义为模板函数

TODO