MS2015 CppUnitTestFramework:重载模板类的 ToString

MS2015 CppUnitTestFramework: overloading ToString for template classes

本文关键字:ToString CppUnitTestFramework 重载 MS2015      更新时间:2023-10-16

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

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

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

昆汀似乎是对的:

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

我用重载替换了专业化,这起到了作用。谢谢。思考错误,我必须专业化,而超载也一样好。