我在哪里定义谓词和函数对象?

时间:2013-03-06 20:01:57

标签: c++ predicate function-object

我的问题是纯粹的组织性质,因此我发现潜在的答案可能是主观的。经过多年与C#的合作,我终于回到了C ++,并且正在努力适应如何正确组织文件。

基本上,我想知道定义谓词和函数对象的最佳位置。目前,我在一个类中使用一个简单的函数对象来实现STL算法。这个函数对象对任何其他类都没用,所以我把它放在哪里呢?我是否将它放在相同的命名空间和头文件或.cpp文件中?我是将它放在匿名命名空间中还是将其放在自己的header / cpp文件中?

提前感谢您提供任何和所有答案,

凯文

4 个答案:

答案 0 :(得分:1)

它确实取决于谓词是什么,如果它对最终用户有任何用处,我会把它的声明放在标题中,理想情况下是const ref的自由函数,以及源文件中的实现。

如果它是程序的一部分(而不是库),那么我也会为了简单而做同样的事情。

如果它严格用于内部使用,并且您不希望最终用户使用它,那么您可以将它放在源文件中的匿名命名空间中。

答案 1 :(得分:1)

我假设你不能使用C ++ 11,否则我建议尽可能使用lambdas;)但是因为我没有好的论据,这就是我通常做的事情:

如果我只在一个函数中使用谓词,我在函数中声明它,如果我只在一个代码文件中使用它,我把它放在一个匿名命名空间中。我希望尽可能保持.h文件的清洁,以减少重建量和文件依赖性。

我相信使用匿名命名空间或将它们放入函数有助于避免名称冲突并使结果更清晰。

答案 2 :(得分:1)

取决于谓词的使用。既然你说它在其他任何地方都没有用,最好在你的cpp文件中声明它,这样当人们包含你的头文件时不会混淆命名空间。

如果它在文件范围内甚至没有用,你可以考虑使用lambdas,如果它不太复杂的话。如果您无法访问C ++ 11的lambda(或Boost.Lambda),您甚至可以在功能范围内声明本地仿函数。这非常方便!但是,请记住,您不能在文件范围级别使用模板化仿函数,这通常是您想要的(例如,使用模板化迭代器')。

答案 3 :(得分:1)

如果它只是由一个类使用,并且你不希望它对其他任何人有用,那听起来就像是嵌套类的时间:

class SomeClass {
public:
    //...

    struct MyPredicate {
        bool operator() (const SomeData&) const;
    };

};

上面类的实际名称是SomeClass::MyPredicate,因此如果operator()未在其声明中定义,则需要在某处定义SomeClass::MyPredicate::operator()。但是在SomeClass的任何成员中,您只需输入MyPredicate

您还可以使谓词成为其包含类的private成员,在这种情况下,甚至不允许外部代码键入该类的名称。

相关问题