2017-01-24 5 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); 
} 

私が過負荷に特化を置き換えると、これはトリックをしました。ありがとう。私は専門化しなければならないと思っている間違い、過負荷はまあまあです。

関連する問題