请教两个 c++ 问题

  1. 6月前
    6月前小时 重新编辑

    我写了一个矢量类 Vector, 一个矩阵类 Matrix, 二者都继承 Base 类。 代码大致如下

    template <class T>
    class Base
    {
        int N; // 矩阵元的总个数
        T* p; // 第一个矩阵元的指针, 动态分配内存储存所有矩阵元
        T& operator()(int i) {return p[i]}
        int size() {return N};
        ...
    }
    
    template <class T>
    class Vector : Base<T>
    {
        void resize(int new_Nsize); // 删除旧内存,分配新大小的内存, N = new_Nsize
        ...
    }
    
    template <class T>
    class Matrix : Base<T>
    {
        int Ncols, Nrows; // 矩阵行数和列数
        void resize(int new_Nrows, int new_Ncols); // 删除旧内存,分配新大小的内存, N = new_Nrows*new_Ncols
        ....
    }

    现在我想写一个支持任何矢量或矩阵的函数, 例如

    template <class T, class T1, class T2>
    void plus(Base<T>& v, Base<T1>& v1, Base<T2>& v2)
    {
        for (int i = 0; i < v1.size(); ++i)
            v(i) = v1(i) + v2(i);
    }

    这个函数运行没有问题. 然而, 我想在函数内部检查 v, v1, v2 是否同为 Vector 或同为 Matrix, 且检查 v1, v2 是否尺寸相同(如果是矩阵,要求行数和列数都相同), 然后再用 resize() 将 v 的尺寸变为和 v1, v2 一样. 这些能做到吗? 要如何实现(尽量保持高 performance)?

  2. 6月前小时 重新编辑

    另外还有一个关于 template 的问题,比如我另外有一个函数 void func(x, x1, x2), 其中 x 是 Vector 类型, x1 或 x2 可以都为 Vector, 也可以其中一个为普通的 int, double, complex 等标量, 于是我这样声明

    template <class T, class T1, class T2> // 我希望 T, T1, T2 为某种标量类型如 int, double, complex 等
    void func(Vector<T>& x, Vector<T1>& x1, Vector<T2>& x2);
    
    template <class T, class T1, class T2>
    void func(Vector<T>& x, Vector<T1>& x1, T2 x2);
    
    template <class T, class T1, class T2>
    void func(Vector<T>& x, T1 x1, Vector<T2>& x2);

    然而这样写貌似是不行的, 因为例如对于第二个 template, 编译器同样也可以认为 T2 是 Vector<> 类。 而我又不想非常 specific 地声明标量,例如

    template <class T, class T1>
    void func(Vector<T>& x, Vector<T1>& x1, int x2);
    
    template <class T, class T1>
    void func(Vector<T>& x, double x1, Vector<T1>& x2);

    等等。 请问怎么破?

  3. @小时 另外还有一个关于 template 的问题,比如我另外有一个函数 void func(x, x1, x2), 其中 x 是 Vector 类型, x1 或 x2 可以都为 Vector, 也可以其中一个为普通的 int, double, complex 等标量, 于是我这样声明

    template <class T, class T1, class T2> // 我希望 T, T1, T2 为某种标量类型如 int, double, complex 等
    void func(Vector<T>& x, Vector<T1>& x1, Vector<T2>& x2);
    
    template <class T, class T1, class T2>
    void func(Vector<T>& x, Vector<T1>& x1, T2 x2);
    
    template <class T, class T1, class T2>
    void func(Vector<T>& x, T1 x1, Vector<T2>& x2);

    然而这样写貌似是不行的, 因为例如对于第二个 template, 编译器同样也可以认为 T2 是 Vector<> 类。 而我又不想非常 specific 地声明标量,例如

    template <class T, class T1>
    void func(Vector<T>& x, Vector<T1>& x1, int x2);
    
    template <class T, class T1>
    void func(Vector<T>& x, double x1, Vector<T1>& x2);

    等等。 请问怎么破?

    上面那种写法应该可以吧。C++编译器会选择最匹配的函数。

  4. 5月前

    @行人一棹天涯 上面那种写法应该可以吧。C++编译器会选择最匹配的函数。

    非常感谢! 原来是因为 Vector<T>& 要比 T& 更加 specialized。

 

后才能发言