我想知道以下段落的含义以及如何执行它。昨天我问了一个与here相同的问题。在昨天的问题中,有人告诉我这是不可能的,但我认为以下段落表明是这样吗?
本质上,我以下列方式组织了一堆求幂技术:
template <class T>
class Exponentiation
{
public:
Exponentiation() {};
virtual ~Exponentiation() {};
// computes C = A^n
virtual void power(T& C, const T& A, const int n) = 0;
}
template <class T>
class ExpA : public Exponentiation<T>
{
public:
ExpA() {};
~ExpA() {};
void power (T& C, const T& A, const int n);
}
template <class T>
class ExpB : public Exponentiation<T>
{
protected:
var1;
var2;
public:
ExpB() {};
~ExpB() {};
func1();
func2();
void power (T& C, const T& A, const int n);
}
现在,最初我有一个
performExp()
,它正在调用特定的幂运算方法,例如-performExp()
{
ExpA<long> objA;
objA.power();
// or
ExpB<long> objB;
objB.func1();
objB.func2();
obj.power ()
}
但是据我所知,更好的选择是使用
performExp()
中的基类,然后使用具体的类main()
或ExpA
中的一个实例化ExpB
中的基类。如何做到这一点?阅读昨天的答案后,我有一个想法是使用某种包装纸,但是我很难想象它。
最佳答案
我看不到您要达到的目标。但是第一个问题是您需要运行时还是编译时多态。查看您的代码,我想是后者。
因此,对于该答案,我假设您拥有模板化的幂运算类,并且在最后编写了compelx计算程序,这些程序将确切知道它们是否适用于ExpA
或ExpB
。
然后,我建议实现performExp()
作为模板函数,以通用方式指示如何执行该操作:
template <class T, template <class U> class Exp>
void performExp(Exp<T>& obj)
{
obj.power();
}
然后可以为该模板提供特化或部分特化:
template <class T>
void performExp(ExpB<T>& obj)
{
obj.func1();
obj.func2();
obj.power();
}
当您在代码中使用这些模板时,编译器将推导参数并使用可能存在的任何特殊化:
int main() {
ExpA<long> a;
performExp(a);
ExpB<long> b;
performExp(b); //specialized form will be used
}
您可以在此online demo中测试结果