C ++ - 基于模板和基于typedef的类层次结构

时间:2012-01-26 00:31:39

标签: c++ templates numbers typedef

我正在编写一个有效数字处理库。我必须支持不同类型的数字 - doublecomplex,甚至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);
    };
}

就我个人而言,我不能接受任何一种方式:基于模板的代码让我感到疯狂,有大量冗余的templatetypename关键字,同时基于typedef的代码无法在单个库中编译文件(链接因名称重复而失败),因此我不能在一个程序中使用不同的数字类型。

所以问题是:我错过了什么吗?是否有更好/更清洁的方式来完成我的任务?

编辑:我必须同时在一个应用程序中使用doublecomplex代码。

EDIT2:好的,为了清楚起见:我正在为iOS应用程序开发一个算术表达式解析引擎。因此,我只限于C / C ++ / Objective-C,性能至关重要。

另外,我觉得在常见情况下使用模板很舒服。在我的情况下,我的所有源文件都包含尖括号和template / typename个关键字。这简直令人烦恼,并且让我分心于编写重要的东西。

我想我会使用模板,因为就我所见,没有更好的解决方案。

3 个答案:

答案 0 :(得分:4)

C ++人员会告诉您使用template而不询问您的代码实际将如何使用。

这里的关键问题是:您的图书馆是否会同时使用两种不同的数字类型

如果答案是“否”,那么模板将是一个糟糕的选择。众所周知,模板不易使用:它们为您创造了更多的工作,为编译器创造了更多的工作,并为IDE做了更多的工作(尝试解析它们以提供自动完成功能)。

只需使用全球typedef即可。从长远来看,你将为自己省去很多麻烦。顺便说一句,this is exactly what the Bullet physics library does

答案 1 :(得分:2)

您应该使用模板。如果你坚持在编译时而不是在运行时完成绝对最大量的工作,并且你选择的语言是C ++,你将使用模板编程。

这是一堆乱七八糟的错误消息,混淆错误消息和typename关键字(当你不想在全局中定义整个类时,不要让我开始明确的实例化)标题!),但这是我们得到的混乱。

编辑:有第三个选项,以预处理的形式 - 您可以通过预处理器运行相同的代码两次,每次将符号放在不同的命名空间中,以获得与typedef相同的效果没有符号冲突的版本。

答案 2 :(得分:1)

真的没有更好的方法。因此,如果您需要在任何给定的程序templates中使用多于一种类型,那么基本上就是这样。如果您确定永远不会发生typedefs,那么在这种情况下它们就足够了,并且更容易阅读/调试。

当然,如果你足够长时间地编写模板,即使它们不是绝对必要的,它们也可以很自然地达到你使用它们的程度(因为有其他合理的方法可以解决给定的问题)。至少那就是发生在我身上的事情