Я хотел бы построить компактный модульный арифметический класс. Идея состоит в том, что модуль M является неизменяемым атрибутом, который фиксируется во время создания экземпляра, поэтому, если у нас есть большой массив (std::vector или другой контейнер) значений с одним и тем же M, M нужно сохранить только один раз.
Если M можно исправить во время компиляции, это можно сделать с помощью шаблонов:
template <typename num, num M> class Mod_template
{
private:
num V;
public:
Mod_template(num v=0)
{
if (M == 0)
V = v;
else
{
V = v % M;
if (V < 0)
V += M;
}
}
// ...
};
Mod_template<int, 5> m1(2); // 2 mod 5
Однако в моем приложении мы должны иметь возможность выражать время выполнения M. То, что у меня есть, выглядит так:
template <typename num> class Mod
{
private:
const num M;
num V;
public:
Mod(num m, num v=0): M(abs(m))
{
if (M == 0)
V = v;
else
{
V = v % M;
if (V < 0)
V += M;
}
}
// ...
};
Mod<int> m2(5, 2); // 2 mod 5
Mod<int> m3(3); // 0 mod 3
Это работает, но большой вектор значений mod M использует в 2 раза больше места, чем ему нужно.
Я думаю, что основная концептуальная проблема заключается в том, что Моды разных модулей синтаксически относятся к одному и тому же типу, даже если они «должны» быть разными типами. Например, такое заявление, как
m2 = m3;
должен вызывать ошибку времени выполнения "естественным образом" (в моей версии это происходит "вручную": проверка встроена в конструктор копирования, а также в каждый бинарный оператор, который я реализую).
Итак, есть ли способ реализовать какую-то динамическую типизацию, чтобы тип объекта Mod запоминал модуль? Я был бы очень признателен за любую идею, как решить эту проблему.
Для меня это повторяющаяся проблема с различными математическими структурами (например, хранение множества перестановок в одном наборе, элементов одной группы и т. д.).
РЕДАКТИРОВАТЬ: насколько я понимаю,
шаблоны — это типы, параметризованные классом или литералом.
что я хочу: тип, параметризованный константным объектом (
const num
в данном случае,const Group&
илиconst Group *const
для групп и т. д.).
Это возможно?
Mod_template<T,M>
вMod<T>
и явным преобразованием (которое может вызвать или утвердить или что-то еще) изMod<T>
вMod_template<T,M>
? Я признаю, что определение операторов было бы еще сложнее... - person aschepler   schedule 23.06.2014M
, которые могут быть использованы. Но это может быть осуществимо. - person EdgarTheWise   schedule 25.06.2014M
. - person aschepler   schedule 26.06.2014