【发布时间】:2023-04-01 17:01:01
【问题描述】:
从 std::binary_function(或 std::unary_function)继承有什么好处?
例如我有这样的代码:
class Person
{
public:
Person();
Person(int a, std::string n);
Person(const Person& src);
int age;
std::string name;
};
Person::Person()
: age(0)
, name("")
{};
Person::Person(int a, std::string n)
: age(a)
, name(n)
{};
Person::Person(const Person& src)
{
age = src.age;
name = src.name;
};
struct PersonPrint : public std::unary_function<Person, void>{
void operator() (Person p){
std::cout << " Person age: " << p.age
<< " name: " << p.name << std::endl;
}
};
struct PersonGreater : public std::binary_function<Person, Person, bool>{
bool operator()(const Person& p1, const Person p2){
if (p1.age > p2.age) return true;
if (p1.name.compare(p2.name) > 0) return true;
return false;
}
};
int main(int count, char** args)
{
std::vector<Person> personVec;
Person p1(10, "Person1");
Person p2(12, "Person2");
Person p3(12, "Person3");
personVec.push_back(p1);
personVec.push_back(p2);
personVec.push_back(p3);
std::cout << "before sort: " << std::endl;
std::for_each(personVec.begin(), personVec.end(), PersonPrint());
std::sort(personVec.begin(), personVec.end(), PersonGreater());
std::cout << "after: " << std::endl;
std::for_each(personVec.begin(), personVec.end(), PersonPrint());
}
但是我也可以在没有继承形式std::unary_function/std::binary_function的情况下编写这段代码?
struct PersonPrint {
void operator() (Person p) {
std::cout << " Person age: " << p.age << " name: " << p.name << std::endl;
}
};
struct PersonGreater {
bool operator()(const Person& p1, const Person p2) {
if (p1.age > p2.age) return true;
if (p1.name.compare(p2.name) > 0) return true;
return false;
}
};
更新
std::binary_function 和 std::unary_function 自 C++11 起已弃用,请参阅@AlexandreC 的评论。
【问题讨论】:
-
它们在 C++11 中已被弃用(当然,在提出问题时还没有 C++11)。
-
@AlexandreC。我们应该改用什么?在 c++ 编码标准中,andrei 提到它们对于构造与 stl 算法一起使用的函子至关重要
-
@kirill_igum:现在
decltype、auto和std::result_of可用,您不需要继承任何东西。此外,bind1st和bind2nd已被弃用,取而代之的是bind。 -
@AlexandreC。所以也不需要创建仿函数而不是函数吗?早些时候,函子的原因是可以从 binary_function 中继承。
-
@kirill_igum:仿函数可以存储状态,而裸函数不能。