C ++泛型类 - 分离接口和实现

时间:2013-09-20 12:53:54

标签: c++ class generics interface header-files

一种非常常见的编码实践是通过在每个类的基础上使用.h.cpp文件来将类的接口与其成员函数的实现分开。因此,使用class Foo头文件和相应的Foo.h文件可以实现Foo.cpp

在泛型类的特殊情况下,这常常被抛出窗口,而header-only库则用于保持编译器满意,即使它使接口文件与实现细节混杂在一起。

我最近遇到了一些代码,如下所示。 .h文件包含接口和#include.hpp文件,其中包含通用成员函数的实现。

e.g。对于T型简单容器 Value.h

#ifndef VALUE_H
#define VALUE_H

template <typename T>
class Value
{
public:
    Value(T value);
    void set(T value);
    T get() const;
private:
    T data;
};

#include "Value.hpp"

#endif

和相应的Value.hpp

#ifndef VALUE_HPP
#define VALUE_HPP

template <typename T>
Value<T>::Value(T value) : data(value)
{
}

template <typename T>
void Value<T>::set(T value)
{
    data = value;
}

template <typename T>
T Value<T>::get() const
{
    return data;
}

#endif

这样做的好处是可以更好地分离界面和实现,再加上实际编译的进一步好处(在我的有限测试中)。

我的问题是采用这种惯例是否有任何隐藏的陷阱

2 个答案:

答案 0 :(得分:2)

由于您需要在使用Value类的每个文件中包含“value.h”和“value.hpp”,因此编译时没有任何好处。但是,如果你的意思是“它编译”而不是将实现放在.cpp文件中的解决方案,那么是的,有一个好处。

当然有一个好处是你可以很容易地看到类提供的接口,而不会让文件与一堆实现代码混杂在一起。

我不确定“value.h”和“value.hpp”的命名约定是“最佳”选择。我认为“value.inl”是第二个文件的更好名称。

答案 1 :(得分:1)

这个解决方案没有特别的缺陷。 .hpp文件只是另一个头文件,其中包含模板化类声明的方法的定义。由于模板类的方法需要在头文件中定义,因此这是将声明与定义分离的便捷方法。扩展名.hpp显示它是标题和实现文件的混合,并且是常用的。

相关问题