私が見たMethodBの主な技術的欠点は、ジェネリックコードを適用するときに、constバージョンとnon-constバージョンの両方を処理するためにコードを2倍にする必要があることです。例えば:
Tが注文可能なオブジェクトであるとしましょう(つまり、演算子<を使用してタイプTのオブジェクトと比較できます)、2つのMethodA(または2つの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オブジェクトとnon-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-nessの使用に関してコンパイラーを信頼しないことにより、1つで十分なはずのときに、2つのジェネリック関数を作成する必要があります。
もちろん、十分なパラノイアがあれば、2番目のテンプレート関数はgetMaxAsConstと呼ばれるはずです...したがって、問題はすべてのコードに伝播します...
:-p