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



我的问题纯粹是组织性的,因此我意识到潜在的答案本质上可能是主观的。在使用c#工作多年之后,我终于回到了c++,并且正在努力适应如何正确组织文件。

基本上,我想知道定义谓词和函数对象的最佳位置。目前,我在一个类中为STL算法使用一个简单的函数对象。这个函数对象不会对任何其他类有用,那么我把它放在哪里呢?我应该把它放在相同的名称空间和头文件中,还是放在.cpp文件中?我把它放在一个匿名的名称空间还是我把它放在自己的头/cpp文件?

提前感谢你的任何和所有的回答,

凯文

这真的取决于谓词是什么,如果它可能对最终用户有任何用处,我会把它的声明放在头文件中,理想情况下作为const ref的自由函数,并在源文件中实现。

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

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

我假设你不能使用c++ 11,否则我建议尽可能使用lambdas;)然而,由于我没有好的参数,这里只是我通常做的:

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

我相信使用匿名命名空间或将其放入函数中有助于避免名称冲突并产生更简洁的代码。

取决于谓词的使用。既然您说它在其他任何地方都没有用,那么最好在您的cpp文件中声明它,以免在人们包含您的头文件时使名称空间混乱。

如果它在文件范围内没有用处,如果不是太复杂的话,可以考虑使用lambdas。如果您无法访问c++ 11的lambda(或Boost.Lambda),您甚至可以在函数范围内声明局部函函数。这很方便!然而,请记住,你不能在文件作用域级别使用模板化的函数,而这通常是你想要的(这里的一个例子是使用'模板化的迭代器')。

如果它只被一个类使用,并且您不期望它对其他任何人都有用,那么这听起来正是嵌套类的时候:

class SomeClass {
public:
    //...
    struct MyPredicate {
        bool operator() (const SomeData&) const;
    };
};

上面的类的实际名称是SomeClass::MyPredicate,因此,如果在声明时没有定义operator(),则需要在某处定义SomeClass::MyPredicate::operator()。但是在SomeClass的任何成员中,你都可以输入MyPredicate

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

最新更新