我正在开发游戏引擎,目前仍在设计IO系统。我做到了,引擎本身不处理任何文件格式,而是让用户通过创建内部带有适当命名函数的*.dll
文件来实现他想要的任何东西。尽管这本身并不是什么大问题,但我主要担心的是在使用引擎期间可能会看到的含义。
我设计了一个简单的resource
接口(interface)作为用户可以想到的所有内容的基类,并且我试图通过制作专用于常见数据类型的简单子(monad)类来扩展它,因此用户不必实现基础知识(目前我正在考虑audio
,image
,data
和mesh
)。从audio
类开始,我偶然发现了一个特殊的问题,同时试图决定我应该以哪种类型存储有关采样率的信息。通常的单位是赫兹,因此我决定将其设置为unsigned int
。
但是,这里存在一个小问题-如果用户尝试将其设置为千赫兹怎么办?假设某种抽象文件格式可以将其同时存储在两个单元中。我制作了一个简单的包装器类来命名单位类型:
class hertz{
private:
unsigned int value;
hertz(){};
public:
operator unsigned int();
hertz(unsigned int value);
};
并决定让用户也使用kHz:
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));
我的问题是:
另请注意,在创建引擎的过程中,我可能需要更多与赫兹不兼容的单元。从头顶开始-我可能希望用户能够同时执行
units::rgb(123,42,120)
和units::hsl(10,30,240)
来设置像素颜色。我尝试搜索可行的答案,但只找到this question,但是OP仅希望数量级而不确保单位与其他单位不兼容。
另外请注意,我使用的是旧的
C++
版本,而不是C++11
。虽然发布一个在任何版本中都有效的解决方案都很棒,但是如果我也可以使用它,那将是很好的:) 最佳答案
我知道您提到您未使用C++ 11,但其他人可能正在研究此问题,因此这是使用用户定义文字的C++ 11解决方案:
http://ideone.com/UzeafE
#include <iostream>
using namespace std;
class Frequency
{
public:
void Print() const { cout << hertz << "Hz\n"; }
explicit constexpr Frequency(unsigned int h) : hertz(h) {}
private:
unsigned int hertz;
};
constexpr Frequency operator"" _Hz(unsigned long long hz)
{
return Frequency{hz};
}
constexpr Frequency operator"" _kHz(long double khz)
{
return Frequency{khz * 1000};
}
int main()
{
Frequency(44100_Hz).Print();
Frequency(44.1_kHz).Print();
return 0;
}
输出:
44100Hz
44100Hz
关于c++ - C++中的计量单位,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21868368/