C++ 模板类类型限定


#include <iostream>
#include <type_traits>
using namespace std;
namespace
{
    class IAnimal
    {
    public:
        virtual void say() = 0;
    };

    class Dog : IAnimal
    {
    public:
        void say() override
        {
            cout << "我是 狗!!" << '\n';
        }
    };

    class Cat : IAnimal
    {
    public:
        void say() override
        {
            cout << "我是 猫!!" << '\n';
        }
    };

    class Horse
    {
    public:
        void say()
        {
            cout << "我是 马!!" << '\n';
        }
    };
}

template <typename T,
    typename = typename std::enable_if<std::is_base_of<IAnimal, T>::value>::type>
    class MyPet
{
public:
    void sayWhat()
    {
        m_pet.say();
    }
private:
    T m_pet;
};

int main()
{
    MyPet<Dog> myDog;
    myDog.sayWhat();

    MyPet<Cat> myCat;
    myCat.sayWhat();
    
    // 放开注释 typename = typename std::enable_if ... ::type> type 会找不到而报错
   /* MyPet<Horse> myHorse;
    myHorse.sayWhat();*/

    system("pause");
    return EXIT_SUCCESS;
}

输出:

我是 狗!!
我是 猫!!
template <typename T,
    typename = typename std::enable_if<std::is_base_of<IAnimal, T>::value>::type>
    class MyPet
{
}

is_base_of 为 true 会展开成:

template <typename T,
    typename = void
    class MyPet
{
}

is_base_of 为 false 时会找不到 Type 而报错。




posted @   double64  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2022-09-08 警惕从语义上破坏封装性
2021-09-08 塑料的定义与分类
点击右上角即可分享
微信分享提示