我正在编写一个有效数字处理库。我必须支持不同类型的数字 - double
,complex
,甚至custom_matrix
。出于性能原因,我决定为每种数字类型编译单独的库文件,以便编译器可以对算术运算和函数调用使用积极的优化。现在我有两个选项 - 要么编写带参数number_type
的模板类,例如
template <typename valueType>
class Worker {
valueType process(valueType value);
};
项目范围的头文件中的或typedef
种类,例如
in 'project.hpp':
namespace myProject {
typedef double valueType;
}
in 'worker.hpp':
#include "project.hpp"
namespace myProject {
class Worker {
valueType process(valueType value);
};
}
就我个人而言,我不能接受任何一种方式:基于模板的代码让我感到疯狂,有大量冗余的template
和typename
关键字,同时基于typedef的代码无法在单个库中编译文件(链接因名称重复而失败),因此我不能在一个程序中使用不同的数字类型。
所以问题是:我错过了什么吗?是否有更好/更清洁的方式来完成我的任务?
编辑:我必须同时在一个应用程序中使用double
和complex
代码。
EDIT2:好的,为了清楚起见:我正在为iOS应用程序开发一个算术表达式解析引擎。因此,我只限于C / C ++ / Objective-C,性能至关重要。
另外,我觉得在常见情况下使用模板很舒服。在我的情况下,我的所有源文件都包含尖括号和template
/ typename
个关键字。这简直令人烦恼,并且让我分心于编写重要的东西。
我想我会使用模板,因为就我所见,没有更好的解决方案。
答案 0 :(得分:4)
C ++人员会告诉您使用template
而不询问您的代码实际将如何使用。
这里的关键问题是:您的图书馆是否会同时使用两种不同的数字类型 ?
如果答案是“否”,那么模板将是一个糟糕的选择。众所周知,模板不易使用:它们为您创造了更多的工作,为编译器创造了更多的工作,并为IDE做了更多的工作(尝试解析它们以提供自动完成功能)。
只需使用全球typedef
即可。从长远来看,你将为自己省去很多麻烦。顺便说一句,this is exactly what the Bullet physics library does。
答案 1 :(得分:2)
您应该使用模板。如果你坚持在编译时而不是在运行时完成绝对最大量的工作,并且你选择的语言是C ++,你将使用模板编程。
这是一堆乱七八糟的错误消息,混淆错误消息和typename
关键字(当你不想在全局中定义整个类时,不要让我开始明确的实例化)标题!),但这是我们得到的混乱。
typedef
相同的效果没有符号冲突的版本。
答案 2 :(得分:1)
真的没有更好的方法。因此,如果您需要在任何给定的程序templates
中使用多于一种类型,那么基本上就是这样。如果您确定永远不会发生typedefs
,那么在这种情况下它们就足够了,并且更容易阅读/调试。
当然,如果你足够长时间地编写模板,即使它们不是绝对必要的,它们也可以很自然地达到你使用它们的程度(因为有其他合理的方法可以解决给定的问题)。至少那就是发生在我身上的事情