C ++模板元程序。条件内存分配

时间:2018-01-27 22:06:31

标签: c++ c++11 templates template-meta-programming

我正在尝试实现一个简单的线性代数库(用于学习目的)。

问题=>我希望Matrix模板类在编译时声明一个固定大小的数组,或者如果RowsColumns的数量尚未知道则使用动态内存分配。

我如何有效/正确地做到这一点? (我已经有了一个简单/天真的想法):

const long Dynamic = -1;

template<typename T, long Rows, long Cols>
class Matrix {
    private:
        enum {
            kIsDynamicStorage = Rows == Dynamic || Cols == Dynamic
        };

        //?? conditional<is_dynamic_storage, vector<vector<T>>, T[Rows][Cols]> storage;
        // Use for fixed-size
        array<array<T, kIsDynamicStorage ? 0: Cols>, kIsDynamicStorage ? 0: Rows> storage;
        // Use for dynamic size
        vector<vector<T>> dynamic_storage;

    public:
        enum {
            kRowsAtCompileTime = Rows,
            kColsAtCompileTime = Cols
        };


        Matrix();
        // Use for dynamic size
        Matrix(size_t rows, size_t cols);
};

有没有正确/更好的方法呢?

1 个答案:

答案 0 :(得分:0)

如何使用std::conditional

  static constexpr bool isDS { (Rows == Dynamic) || (Cols == Dynamic) };

  typename std::conditional<isDS,
     std::vector<std::vector<T>>,
     std::array<std::array<T, Cols>, Rows>>::type  storage;