Я работаю над движком игры, и в настоящее время я застрял в разработке системы ввода-вывода. Я сделал это, сам движок не обрабатывает форматы любых, а позволяет пользователю реализовать все, что ему нужно, создав файл *.dll
с appriopriatly именованными функциями внутри. Хотя это само по себе не было большой проблемой, моя главная проблема связана с последствиями, которые, вероятно, будут видны во время использования движка.
Я разработал простой интерфейс resource
в качестве базового класса для всех вещей, которые пользователь может придумать, и я пытаюсь расширить его, создав простые дочерние классы, посвященные общим типам данных, так что пользователь не " (в настоящее время я думаю о audio
, image
, data
и mesh
). Начиная с класса audio
, я провалялся на особую проблему, пытаясь решить, в каком типе я должен хранить информацию о частоте дискретизации. Обычный блок герц, поэтому я решил сделать его unsigned int
.
Однако здесь есть небольшая проблема - что, если пользователь пытается установить его в килогерц? Предположим, что некоторый абстрактный формат файла может хранить его в обоих блоках на мгновение. Я создал простой класс-оболочку, чтобы назвать тип единицы:
class hertz{
private:
unsigned int value;
hertz(){};
public:
operator unsigned int();
hertz(unsigned int value);
};
и решил разрешить пользователю использовать кГц:
class kilohertz{
private:
float value;
kilohertz(){};
public:
operator hertz();
kilohertz(float value);
};
В то время как функция внутри класса audio
, которая позволяет пользователю установить частоту дискретизации, объявляется как track& samplingRate(units::hertz rate);
. Пользователь должен вызывать его, явно указывая, какой порядок он использует:
someAudioFile.samplingRate(hertz(44100));
someAudioFile.samplingRate(kilohertz(44.1));
Мой вопрос:
Есть ли лучший способ заставить пользователя использовать измерительный блок простым и элегантным способом? Может быть, шаблон дизайна или какое-то умное использование typedefs?
Также обратите внимание, что в процессе создания двигателя мне может потребоваться больше единиц, которые будут несовместимы с Hertz. С моей точки зрения, я хочу, чтобы пользователь мог установить цвет пикселя, выполнив units::rgb(123,42,120)
и units::hsl(10,30,240)
.
Я пробовал искать жизнеспособный ответ и нашел этот вопрос, но OP только захотел заказов без гарантии того, что юниты не совместимы с другими.
Также обратите внимание, что я использую старую версию C++
, а не C++11
. Хотя публикация решения, действующего в любой версии, великолепна, было бы неплохо, если бы я мог ее использовать:)