我有一些函数可以组合在一起,但不属于某个对象/实体,因此不能被视为方法。
所以,基本上在这种情况下,我会创建一个新的命名空间并将定义放在 header
文件中,将实现放在 cpp
文件中。此外(如果需要)我会在该 cpp
文件中创建一个匿名命名空间,并将所有不必公开/包含到我的命名空间接口(interface)的附加功能放在那里。
请参阅下面的代码(可能不是最好的示例,可以使用其他程序架构做得更好,但我想不出更好的示例...)
示例代码(header
)
namespace algorithm {
void HandleCollision(Object* object1, Object* object2);
}
示例代码(cpp
)
#include "header"
// Anonymous namespace that wraps
// routines that are used inside 'algorithm' methods
// but don't have to be exposed
namespace {
void RefractObject(Object* object1) {
// Do something with that object
// (...)
}
}
namespace algorithm {
void HandleCollision(Object* object1, Object* object2) {
if (...) RefractObject(object1);
}
}
到目前为止一切顺利。我想这是管理我的代码的好方法,但我不知道如果我有一些基于模板的功能并且基本上想做的话我该怎么办一样。
如果我使用模板,我必须将所有代码放在header
文件中。好的,但是我应该如何隐藏一些实现细节呢?
我想从我的界面中隐藏 RefractObject
函数,但我不能简单地删除它的声明(只是因为我的所有代码都在一个 header
文件中)。 ..
我想到的唯一方法是这样的:
示例代码(header
)
namespace algorithm {
// Is still exposed as a part of interface!
namespace impl {
template <typename T>
void RefractObject(T* object1) {
// Do something with that object
// (...)
}
}
template <typename T, typename Y>
void HandleCollision(T* object1, Y* object2) {
impl::RefractObject(object1);
// Another stuff
}
}
有什么想法可以在代码设计方面做得更好吗?
最佳答案
这是一个很常见的解决方案。 Boost 做到了,我也做到了,但使用的是 detail
命名空间。只需制定一条规则:“不要向内看 detail
!”
在文件方面,我建议为详细信息提供自己的文件,并将其隐藏在详细信息文件夹中。也就是说,我的代码类似于:
// v
#include "detail/RefractObject.hpp"
namespace algorithm {
template <typename T, typename Y>
void HandleCollision(T* object1, Y* object2) {
detail::RefractObject(object1);
// Another stuff
}
}
这只是一般的良好代码实践(保持内容拆分和可重用)并使头文件的实现细节更清晰。
关于C++ 命名空间和模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2794956/