Cos*_*ert 7 c++ templates namespaces
我有一些功能可以组合在一起,但不属于某个对象/实体,因此不能被视为方法.
所以,基本上在这种情况下我会创建一个新的命名空间并将定义放在一个header文件中,即文件中的实现cpp.另外(如果需要)我将在该cpp文件中创建一个匿名命名空间,并将所有不必公开/包含的其他函数放在我的命名空间接口中.
请参阅下面的代码(可能不是最好的示例,可以使用其他程序架构更好地完成,但我想不出更好的示例...)
示例代码(header)
namespace algorithm {
void HandleCollision(Object* object1, Object* object2);
}
Run Code Online (Sandbox Code Playgroud)
示例代码(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);
}
}
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.我想这是管理我的代码的好方法,但我不知道如果我有一些基于模板的函数并且想要做的基本相同,我该怎么办.
如果我使用模板,我必须将所有代码放在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
}
}
Run Code Online (Sandbox Code Playgroud)
任何想法如何在代码设计方面做得更好?
这是一个非常常见的解决方案.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
}
}
Run Code Online (Sandbox Code Playgroud)
这只是一般的良好代码实践(保持分离和可重用)并使头文件更清晰的实现细节.