Я реализую сложную арифметику с использованием переменной точности с фиксированной точкой. я определил: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