可変固定小数点精度を使用して複雑な算術演算を実装しています。 私が定義した:MS2015 CppUnitTestFramework:テンプレートクラスのToStringをオーバーロードする
template <int N, int M> class FixedPoint {...}
そして:
template <typename T> class Complex {...}
を今、私は別の固定小数点精度のためのユニットテストを実行したいです。例えば。 Complex<FixedPoint(1,4)>
,Complex<FixedPoint(128,6)>
,Complex<double>
など
複雑な表現はかなり単純である。実数部と虚数部を表示するだけです。だから、wchar文字出力をストリーミングすることは次のようになります。
[within template class]
// output wchar stream
friend inline std::wostream& operator<< (
std::wostream& outputStream, const Complex& object)
{
if (object.Imaginary < 0)
{
// imaginary negative: sign is included
outputStream << object.Real << object.Imaginary << "i";
}
else
{
// imaginary zero or positive: add sign
outputStream << object.Real << "+" << object.Imaginary << "i";
}
return outputStream;
}
しかし、今問題が来る:ユニットテストフレームワークのToStringメソッドは、テンプレートの特殊化を必要とし、部分的な特殊化が許可されていないので、私が使用するすべてのために同じToStringメソッドの特殊化を実装する必要がありますデータ型!例えば。
namespace Microsoft
{
namespace VisualStudio
{
namespace CppUnitTestFramework
{
// requires separate specializations for all implementations,
// because partial specialization is not allowed
template<>
static inline std::wstring
ToString<Complex<Double>>(
const Complex<Double>& object)
{
RETURN_WIDE_STRING(object);
}
template<>
static inline std::wstring
ToString<Complex<FixedPoint(1,4)>>(
const Complex<FixedPoint(1,4)>& object)
{
RETURN_WIDE_STRING(object);
}
[etc....etc....]
}
}
}
これは一見余計な作業です。部分的な専門化が私をここで節約するでしょう。しかしそれは許されない。誰もスマートなアイデアを持っていますか?
これは本当にうまくいきますので、ここでもっとうまくいくはずです。http://codereview.stackexchange.com/ – amrdruid
うわー、これは愚かです...私は手元にフレームワークを持っていませんが、代わりに過負荷を定義しますチャンス? – Quentin