Я работаю над движком игры, и в настоящее время я застрял в проектировании системы ввода-вывода. Я сделал это так, сам движок не обрабатывает любые форматы файлов, а позволяет пользователю реализовать все, что он хочет, создав файл *.dll
с appriopriatly именованными функциями внутри. В то время как это само по себе не было большой проблемой, моя главная проблема связана с последствиями, которые, вероятно, будут видны во время использования двигателя.Единицы измерения в C++
Я разработал простой интерфейс resource
в качестве базового класса для всех вещей, которые пользователь может придумать, и я пытаюсь расширить его, создав простые дочерние классы, посвященные общим типам данных, поэтому пользователь не должны сами реализовать основы (в настоящее время я думаю о audio
, image
, data
и mesh
). Начиная с класса audio
, я пробормотал на особую проблему, пытаясь решить, в каком типе я должен хранить информацию о частоте выборки . Обычный блок hertz, поэтому я решил сделать его unsigned int
.
Однако здесь есть небольшая проблема: что делать, если пользователь пытается установить его в kilohertz? Предположим, что некоторый абстрактный формат файла может хранить его в обоих блоках на мгновение. Я сделал простой класс обертку назвать тип блока:
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)
.
Я пробовал искать жизнеспособный ответ и нашел только this question, но OP только желал заказов без обеспечения того, что устройства не совместимы с другими.
Также обратите внимание, что я использую старую версию C++
, а не C++11
. При публикации решения, имеющегося в любой версии, отлично, было бы неплохо, если бы я мог его использовать :)
Не можете ли вы просто правильно документировать свой API? –
Да, во избежание путаницы, возможно, у вас должен быть свой API-интерфейс на один стандарт, герц или килогерц, не оба. – leetNightshade
Документирование моего API ничего не изменит, так как я хочу, чтобы пользователь мог использовать оба, когда дело касается - например, - установки цвета. Так что это не совсем решение. Возможно, это сработает с герцем, но это всего лишь одна единица. –