MS2015 CppUnitTestFramework:为模板类重载ToString

时间:2017-01-24 09:18:27

标签: c++ unit-testing visual-studio-2015

我正在使用可变定点精度实现复杂算术。 我已定义:

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特化! E.g。

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....]
        }
    }
}

这是一项看似多余的工作!部分专业化会在这里拯救我。但这是不允许的。有没有人有一个聪明的想法?

1 个答案:

答案 0 :(得分:0)

看来昆汀是对的:

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

我用过载取代了专业化,这就是诀窍。谢谢。我想要专注的思维错误,而重载也同样好。