我的问题纯粹是组织性质的,因此我意识到潜在的答案可能是主观的。经过多年的 C# 工作,我终于回到了 C++ 并且正在努力适应如何正确组织文件。
基本上,我想知道定义谓词和函数对象的最佳位置在哪里。目前,我在单个类中为 STL 算法使用了一个简单的函数对象。这个函数对象对任何其他类都没有用,那么我把它放在哪里呢?我是否将它放在同一个命名空间和头文件或 .cpp 文件中?我是将它放在匿名命名空间中还是将它放在它自己的头文件/cpp 文件中?
预先感谢您的任何和所有答案,
凯文
我的问题纯粹是组织性质的,因此我意识到潜在的答案可能是主观的。经过多年的 C# 工作,我终于回到了 C++ 并且正在努力适应如何正确组织文件。
基本上,我想知道定义谓词和函数对象的最佳位置在哪里。目前,我在单个类中为 STL 算法使用了一个简单的函数对象。这个函数对象对任何其他类都没有用,那么我把它放在哪里呢?我是否将它放在同一个命名空间和头文件或 .cpp 文件中?我是将它放在匿名命名空间中还是将它放在它自己的头文件/cpp 文件中?
预先感谢您的任何和所有答案,
凯文
取决于谓词的用途。由于您说它在其他任何地方都没有用,因此最好在您的 cpp 文件中声明它,以免在人们包含您的头文件时弄乱命名空间。
如果它在文件范围内甚至没有用,如果不是太复杂,您可以考虑使用 lambdas。如果您无法访问 C++11 的 lambda(或 Boost.Lambda),您甚至可以在函数范围内声明本地函子。这很方便!但是,请记住,您不能在文件范围级别使用模板化仿函数,这通常是您想要的(这里的一个示例是使用“模板化迭代器”)。
我假设您不能使用 C++11,否则我建议尽可能使用 lambdas ;) 但是,由于我没有好的论据,这正是我通常会做的:
如果我只在一个函数中使用谓词,我在函数中声明它,如果我只在一个代码文件中使用它,我把它放在匿名命名空间中。我喜欢保持 .h 文件尽可能干净,以减少重建和文件依赖的数量。
我相信使用匿名命名空间或将它们放入函数中有助于避免名称冲突并产生更清晰的代码。
这真的取决于谓词是什么,如果它对最终用户有任何用处,我会将它的声明放在标题中,理想情况下作为 const ref 采用的自由函数,并在源文件中实现。
如果它是程序的一部分(而不是库),那么为了简单起见,我也会这样做。
如果它只供内部使用并且您不希望最终用户使用它,那么您可以将它放在源文件中的匿名命名空间中。
如果它只供一个类使用,并且您不希望它对其他人有用,那听起来正是嵌套类的时间:
class SomeClass {
public:
//...
struct MyPredicate {
bool operator() (const SomeData&) const;
};
};
上面类的实际名称是SomeClass::MyPredicate
,因此如果operator()
在其声明中未定义 ,则需要在SomeClass::MyPredicate::operator()
某处定义。但是在你们中的任何成员中SomeClass
都可以输入MyPredicate
.
您还可以使谓词成为private
其包含类的成员,在这种情况下,甚至不允许外部代码键入该类的名称。