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

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

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

问题 => 我希望 Matrix 模板类在编译时声明一个固定大小的数组,或者如果 Rows 的数量和 未知。

我怎样才能有效/正确地做到这一点? (我已经有了一个简单/幼稚的想法):

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);
};

有没有正确/更好的方法来做到这一点?

最佳答案

使用 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;

关于C++ 模板元程序。条件内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48481037/

相关文章:

c++ - 你如何调用一个返回引用或抛出异常的函数而无需体操?

c++ - 不存在从 “cv::Mat”到 “IplImage”的合适的用户定义转换

c++ - 是否存在无法避免 lambda 中的尾随返回类型语法的情况?

c++ - 如何使用另一个类作为类模板特化

c# - Serial port write究竟是如何从缓冲区写入数据的呢?

c++ - 为什么Xcode 4.3静态分析这段代码会报逻辑错误?

c++ - move 构造函数不能默认

C++11 原子 : does it make sense, 或者甚至可以将它们与内存映射 I/O 一起使用?

c++ - 在不知道模板参数的映射中获取派生类的模板参数类型

C++ 模板;作为模板参数传递的函数的自动推导返回类型;