2017-01-24 3 views
0

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

Это, по-видимому, избыточная работа! частичная специализация спасла бы меня здесь. Но это не допускается. У кого-нибудь есть умная идея?

+0

Поскольку он действительно работает, он должен больше подходить здесь http://codereview.stackexchange.com/ – amrdruid

+0

Ничего себе, это глупо ... У меня нет рамки под рукой, но будет определять перегрузку вместо работы шанс? – Quentin

ответ

0

Кажется, Квентин был прав:

template<typename T> 
    static inline std::wstring ToString(const Complex<T>& object) 
{ 
    RETURN_WIDE_STRING(object); 
} 

я заменил специализацию с перегрузкой, и это сделал трюк. Благодарю. Мышление, которое я хотел бы специализировать, в то время как перегрузка так же хороша.

Смежные вопросы