我正在开发游戏引擎,目前仍在设计IO系统。我做到了,引擎本身不处理任何文件格式,而是让用户通过创建内部带有适当命名函数的*.dll文件来实现他想要的任何东西。尽管这本身并不是什么大问题,但我主要担心的是在使用引擎期间可能会看到的含义。

我设计了一个简单的resource接口(interface)作为用户可以想到的所有内容的基类,并且我试图通过制作专用于常见数据类型的简单子(monad)类来扩展它,因此用户不必实现基础知识(目前我正在考虑audioimagedatamesh)。从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/

10-13 06:18