使用模板和概念的多态性

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

我有这段代码,其中

Derived
Base
的子类,我需要有不同版本的
func
方法,假设
proc
方法很常见并且有很多语句。

概念和模板编程允许这样的要求吗?

要求是:有两个不同的类具有相同的代码,但每个类都有自己的(特定)func 方法。

我可以在不继承的情况下实现这一目标吗? 下面是代码。

// templateInheritance.cpp

#include <iostream>

template <typename T>
class Base{
public:
    void func(){                    // (1)
        std::cout << "Base::func\n";
    }

    void proc()
    {
        // huge stuff goes here
        func();
        // huge stuff goes here
    }
};

template <typename T>
class Derived: public Base<T>{
public:
    void func(){                    // (2)
        std::cout << "Derived::func\n";
    }
};

int main(){

    std::cout << '\n';

    Derived<int> derived;
    derived.proc();
    Base<int> base;
    base.proc();            

    std::cout << '\n';

}
c++ c++20 c++-concepts c++-templates
1个回答
0
投票

我的理解是,你想要具有编译时多态性。这非常容易实现并且通常被调用。 CRTP

为了简单起见,我将您的

Base
拆分为一个真正的基础和第二个基础,然后第二个基础可用于创建实例,而第一个实际上只是公共基础。

不需要

concepts
,也不需要任何元模板编程。

示例:

#include <iostream>

template <typename T, typename MASTER>
class Base{
public:
    void proc()
    {    
        // huge stuff goes here
        static_cast<MASTER*>(this)->func();
        // huge stuff goes here
    }    
};

template <typename T>
class Base2: public Base< T, Base2<T>>
{
    public:
    void func(){                    // (2)
        std::cout << "Base::func\n";
    }    

};

template <typename T>
class Derived: public Base<T, Derived<T>>{
public:
    void func(){                    // (2)
        std::cout << "Derived::func\n";
    }    
};

int main(){

    std::cout << '\n';

    Derived<int> derived;
    derived.proc();
    Base2<int> base;
    base.proc();     

    std::cout << '\n';

}

观看现场演示

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