← index
cplusplus17.Examples/features/template/multi_dim.cpp
Source: cplusplus17.Examples/features/template/multi_dim.cpp
#include<iostream>
#include<string>

template<typename T>
class Multi_Dim {
public:
    explicit Multi_Dim(int size_x, int size_y) {
        value = nullptr;
        arr_x = arr_y = 0;
        sizeArray(size_x, size_y);
    }
    
    ~Multi_Dim() {
        eraseArray();
    }
    
    void sizeArray(int size_x, int size_y) {
        if(value != nullptr) {
            eraseArray();
        }
        std::cout << "Sizing array to: [" << size_x << "][" << size_y << "]\n";
        value = new T*[size_x];
        for(int i = 0; i < size_x; ++i) {
            value[i] = new T[size_y];
        }
        arr_x = size_x;
        arr_y = size_y;
    }
    
    void eraseArray() {
        if(value == nullptr) return;
        std::cout << "Cleaning up array...\n";
        for(int i = 0; i < arr_x; ++i) {
            delete [] value[i];
        }
        delete [] value;
        value = nullptr;
    }
    
    T &at(unsigned int x, unsigned int y) {
        return value[x][y];
    }
    
    T &operator()(unsigned int x, unsigned int y) {
        return at(x,y);
    }
    
    int X() const { return arr_x; }
    int Y() const { return arr_y; }
    
private:
    T **value;
    int arr_x, arr_y;
};

int main() {
    Multi_Dim<std::string> values(100, 100);
    for(int x = 0;  x < values.X(); ++x) {
        for(int y = 0; y < values.Y(); ++y) {
            std::string &value = values.at(x,y);
            value = "Test 1 2 3";
        }
    }
    
    for(int x = 0;  x < values.X(); ++x) {
        for(int y = 0; y < values.Y(); ++y) {
            std::string &value = values.at(x,y);
            std::cout << value << "\n";
        }
    }

    return 0;
}