我目前正在设计一个API,我希望用户能够编写如下代码:
PowerMeter.forceVoltage(1 mV);
PowerMeter.settlingTime(1 ms);
Run Code Online (Sandbox Code Playgroud)
目前我们使用以下定义执行此操作:
#define mV *1.0e-03
Run Code Online (Sandbox Code Playgroud)
这使得用户编写代码非常方便,并且它也非常易读,但当然也有缺点:
int ms;
Run Code Online (Sandbox Code Playgroud)
会抛出一些难以理解的编译器错误.所以我正在寻找更好的解决方案.
我尝试了新的C++ 11文字,但是我可以实现的是:
long double operator "" _mV(long double value) {
return value * 1e-3;
}
PowerMeter.forceVoltage(1_mV);
Run Code Online (Sandbox Code Playgroud)
最后,API并不关心像Volt或第二个这样的单位,而只关注数字,所以我不想做任何检查,如果你真的输入伏特的强制电压.所以这也应该是可能的:
PowerMeter.forceVoltage(2 ms);
Run Code Online (Sandbox Code Playgroud)
除了坚持定义之外还有什么想法?
我正在实现一个非常简单的带通滤波器,它的输入参数是一个包含高通和低通滤波器的信号,停留时间和截止频率的向量:
typedef std::vector<double> vec;
vec bandPass(const vec& signal, double dwellTime, double lowCutoff, double highCutoff);
Run Code Online (Sandbox Code Playgroud)
我的界面的明显问题是函数调用者必须事先知道预期的时间和频率单位,并且如果必要的话可能必须经历适当地转换它们的烦恼.
我想我可能会std::chrono用来解决我的问题,但我还没有看到它被用来测量频率.我想拥有:
vec bandPass(const vec& signal, milliseconds dwellTime, kHertz lowCutoff, kHertz highCutoff);
Run Code Online (Sandbox Code Playgroud)
并让我的函数将所有单位转换为秒和赫兹进行计算.理想情况下,乘以毫秒和kHz会得到与乘以秒和Hz相同的结果.
有没有人遇到过类似的问题?是否合法的C++可以写出1/10s引用Hertz的内容?
我没有太多使用std :: chrono(以及C++)的经验,希望在定义我的界面之前我可以在这里收集一些智慧的话.任何其他建议也欢迎.