使用模板构造函数完全专门化模板类

时间:2017-03-02 21:33:38

标签: c++ template-specialization

我有一个模板类定义如下:

template<unsigned int N, unsigned int L>
class Matrix
{
    public:

        Matrix(const float k = 0.0f)
        {
            for(unsigned int i = 0; i < N; ++i)
                for(unsigned int j = 0; j < L; ++j)
                {
                    if(i == j) m[i][j] = k;
                    else m[i][j] = 0.0f;
                }
        }

        //With other constuctors, methods and operators

    protected:

        float m[N][L];
};

我想对Matrix&lt; 4u,4u&gt;进行专业化。
除了我将覆盖的函数之外,所有函数都将与模板中的函数做同样的事情:

Vec3 operator*(const Vec3& vec)
{
    Vec3 v;

    if(L != 3)
    {
        if(Core::Debug::Log::CoreLogIsActive)
            Core::Debug::Log::ConsoleLog("Number of column of the matrix is different from the number of column of the vector",
                Core::Debug::LogLevel::Error);
        return v;
    }

    v.x = m[0][0] * vec[0] + m[0][1] * vec[1] + m[0][2] * vec[2];
    v.y = m[1][0] * vec[0] + m[1][1] * vec[1] + m[1][2] * vec[2];
    v.z = m[2][0] * vec[0] + m[2][1] * vec[1] + m[2][2] * vec[2];

    return v;
}

(它会做不同的事情)

我应该如何进行说明? 其他功能并没有从我的特定矩阵&lt; 4u,4u&gt;中改变。但是,如果我进行课程规范,我将不得不指定每个成员赢得了我?

我的猜测是仅指定必须的成员函数,然后只使用

using Matrix4 = Matrix<4u, 4u>

这样就够了吗? 并且我是否能够使用Matrix&lt; 4u,4u&gt;中的运算符进行规范化。喜欢:

template <>
Vec3 Matrix<4u, 4u>::operator*(const Vec3& vec)
{
    Vec4 vec4d(vec);

    vec4d = Matrix<4u, 4u>::operator*(vec);

    return Vec3(vec4d.x, vec4d.y, vec4d.z);
}

另外,我打算在Matrix4

中使用继承

感谢您的时间

1 个答案:

答案 0 :(得分:0)

好吧,我所说的似乎有用(我输错了我无法找到......)

解决方案:

template <>
Vec3 Matrix<4u, 4u>::operator*(const Vec3& vec)
{
    Vec4 vec4d(vec);

    vec4d = Matrix<4u, 4u>::operator*(vec);

    return Vec3(vec4d.x, vec4d.y, vec4d.z);
}

using Matrix4 = Matrix<4u, 4u>