Как разрешить шаблонный аргумент шаблона - PullRequest
0 голосов
/ 09 сентября 2018

В настоящее время я пишу матричный класс, который сможет поддерживать любое количество строк и столбцов с помощью шаблонов. Я застрял на том, как идти о предотвращении недопустимой операции (то есть количество столбцов для матрицы 1, количество строк для матрицы 2). Конечно, я мог бы хранить количество строк и столбцов и проверять их во время выполнения, но оптимально я хотел бы выполнить эту проверку во время компиляции с помощью аргумента шаблона «подстановочный знак».

Другими словами ...

Я хочу сделать это:

template <typename T, int R, int C>
struct mat {

    T matrix[R][C];

    void operator *=(const mat<T, C, [can be anything]> &other) {
        /* do operation */
    }

};

Вместо этого:

template <typename T, int R, int C>
struct mat {

    T matrix[R][C];
    int rows = R;
    int columns = C;

    void operator *=(const mat *other) {
        if (columns != other->rows) {
            /* error */
        } else {
            /* do operation */
        }
    }

};

Возможно ли это? Если да, то как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

Это работает для меня

template <typename T, int R, int C>
struct mat {

    T matrix[R][C];

    template <int CC>
    void operator *=(const mat<T, C, CC> &other) {
        /* do operation */
    }

};

int main()
{
    mat<int, 2, 3> m1;
    mat<int, 3, 4> m2;
    m1 *= m2;
}
0 голосов
/ 09 сентября 2018

Определить шаблон 《int K》 mat 《T, R, K》 & operator * (const mat 《T, C, K》 и другие) ..

...