我最近正在阅读关于C++ Source的系列文章,"暂停反思:五个五个列表".在第五部分中,Scott Meyers讨论了Barton和Nackman解决单位问题的方法.作为航空航天业的嵌入式软件工程师,这个特别的啊哈!片刻让我很兴奋.到目前为止,我还没有听说过这种方法(也没有这些作者).
我已经做过研究,试图找到有关该解决方案的更多信息.我在这里看到了这个演讲:http://se.ethz.ch/~meyer/publications/OTHERS/scott_meyers/dimensions.pdf
我想我理解了我在这个解决方案上所阅读的所有内容.但我觉得有一块拼图丢失了.这个美丽,优雅的解决方案无处可扩展.具体来说,我对转换不仅仅是一个倍增因素感兴趣.例如,温度在开尔文,摄氏和华氏之间转换.我希望能够互换使用这些温度.
我的问题:
我错过了什么?是否参考了我忽略的单位解决方案讨论,在某处讨论了规模?
如果没有,我怎么能进一步解决这个问题?是否存在可与B&N方法结合使用以完成解决方案的现有模式?
我的目标是能够在没有过多计算的情况下使用类似下面示例的代码.在距离的情况下,我希望能够声明一个定义为英里的对象,并以英里为单位执行所有相关计算,而不必经常来回转换为米.
例:
typedef Units<double, miles> uMiles;
typedef Units<double, kilometers> uKilometers;
uMiles d1 (1.0);
uKilometers d2 (1.60934);
d1 += d2;
if (d1.val(miles) == 2.0) // PASS
if (d1.val(kilometers) == 3.21869) // PASS
Run Code Online (Sandbox Code Playgroud)
注意:我已经看到了BOOST UNITS解决问题的方法,我不喜欢它.对我来说这是非常难以理解的.我也不是,通常允许使用外部库,如boost.
资料备份:
单位类如下所述:
template<class T, // Precision
int m, // Mass
int l, // Length
int t, // Time
int q, // Charge
int k, // Temperature
int i, // Luminous Intensity
int a> // …Run Code Online (Sandbox Code Playgroud) 我发现我的命名惯例相当麻烦.我似乎过多地重复使用了孩子的具体名字.在我的下面的例子中,我有一个Widget,它有一个连接,它有一个配置.这些对象中的每一个都具有Foo和Bar类型的专用类.
所以我的FooWidget有一个Foo-Connection,它有一个Foo-Config.对于Bar来说也一样.在C++中,我最终得到了九个不同的头文件.
我不能帮助,但看看这感觉它是不对的.我的直觉告诉我需要改变一些事情.这就像有一个设计模式可以利用.但我找不到更好的解决方案.
所以我想我的问题如下:是否有一种设计模式可以改善这种设计?

- 我正确地纠正了我的问题.请原谅,随着问题本身变得更加明确,我会更新.
我试图使用externs在C++中与Ada连接.这两个实现有什么区别?
实施A.
namespace Ada
{
extern "C"
{
int getNumber();
int index;
int value;
}
}
Run Code Online (Sandbox Code Playgroud)
实施B.
namespace Ada
{
extern "C"
{
int getNumber();
}
extern "C" int index;
extern "C" int value;
}
Run Code Online (Sandbox Code Playgroud)
两种实现都编译得很好.但Impl-A无法链接,我得到索引和值的多重定义错误.我只是想了解这些差异.
我知道在从基类型赋值给受约束的子类型时,如果我不确保该值在赋值之前在范围内,那么我在运行时会遇到Range_Check异常的风险.
但是在进行比较时这也是正确的吗?我认为,由于用户想要的唯一知识是布尔结果,因此不需要隐式转换为基本类型或范围检查.
请注意:我正在寻找引用Ada95 LRM的答案.
declare
type Day_Type is (SUN, MON, TUE, WED, THU, FRI, SAT);
subtype Workday_Type is MON .. FRI;
Payday : constant Workday_Type := FRI;
...
function Is_Payday (Day : Day_Type)
return Boolean is
begin
return (Day = Payday);
end Is_Payday;
begin
-- Will this raise a RANGE_CHECK error in Is_Payday()?
if Is_Payday(Day => SAT) then
...
elsif Is_Payday(Day => FRI) then
...
end if;
end;
Run Code Online (Sandbox Code Playgroud)
我还没有找到完整的答案.但我确实找到了几个有趣的数据.
离散类型的操作/第3.5.5章第12节它说: …
我创建了一个 Ada 类,其实现已经变得相当大。我有一个仅限多个主体的方法,出于可维护性/可读性的目的,我想将其移动到单独的文件中。
我对 Ada95 分离的理解是每个文件只能有一种方法。我有大约 20 个想要分离的方法,但我不希望为此函数创建 20 个单独的文件。
为了分离代码,我想我可以创建一个子包。然后父类就可以调用子类了。
问1 In Ada, Is it wrong/undesirable for a Parent Body unit to depend on a child Unit?
编辑:上述问题太模糊,任何答案都是主观的。
问题2 How can I divide my code into separate files without creating an over abundance of files?