我有这段代码,其中
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';
}
我的理解是,你想要具有编译时多态性。这非常容易实现并且通常被调用。 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';
}