我看到的 MethodB 的主要技术缺陷是,在对其应用泛型代码时,我们必须将代码加倍以同时处理 const 和非 const 版本。例如:
假设 T 是一个可排序的对象(即,我们可以使用运算符 < 与 T 类型的对象进行比较),假设我们想要找到两个 MethodA(分别是两个 MethodB)之间的最大值。
对于 MethodA,我们只需要编写以下代码:
template <typename T>
T & getMax(T & p_oLeft, T & p_oRight)
{
if(p_oLeft.get() > p_oRight.get())
{
return p_oLeft ;
}
else
{
return p_oRight ;
}
}
此代码适用于 T 类型的 const 对象和非 const 对象:
// Ok
const MethodA oA_C0(), oA_C1() ;
const MethodA & oA_CResult = getMax(oA_C0, oA_C1) ;
// Ok again
MethodA oA_0(), oA_1() ;
MethodA & oA_Result = getMax(oA_0, oA_1) ;
当我们想将这个简单的代码应用到遵循 MethodB 约定的东西时,问题就来了:
// NOT Ok
const MethodB oB_C0(), oB_C1() ;
const MethodB & oB_CResult = getMax(oB_C0, oB_C1) ; // Won't compile
// Ok
MethodA oB_0(), oB_1() ;
MethodA & oB_Result = getMax(oB_0, oB_1) ;
为了让 MethodB 在 const 和 non-const 版本上都工作,我们都必须使用已经定义的 getMax,但要添加以下版本的 getMax:
template <typename T>
const T & getMax(const T & p_oLeft, const T & p_oRight)
{
if(p_oLeft.getAsConst() > p_oRight.getAsConst())
{
return p_oLeft ;
}
else
{
return p_oRight ;
}
}
结论,由于不信任编译器的 const 使用,我们负担了创建两个泛型函数的负担,而一个应该足够了。
当然,如果有足够的妄想症,第二个模板函数应该被称为 getMaxAsConst ......因此,问题将通过所有代码传播......
:-p