- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经实现了一个C++程序,该程序创建了三个不同的Person对象。这些对象被共享并存储在 vector 中。
函数getVector()
以const std::vector<std::shared_ptr<Person>>&
作为输入并返回std::vector<Person*>
。结果 vector 中的每个元素对应于输入 vector 中的相应元素。
该函数将std::transform
与std::mem_fn
一起使用。
该功能的实现(以及与std::cout
的相应调用)不起作用。我认为我以错误的方式(错误的参数等)将std::transform
与std::mem_fn
一起使用。
我不知道如何使函数getVector()
工作。
到目前为止,这是我的源代码:
main.cpp
#include <string>
#include <vector>
#include <memory>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <functional>
struct Person
{
std::string first_name;
std::string last_name;
int age;
Person* getPerson(const std::shared_ptr<Person>& person)
{
Person* p = person.get();
return std::move(p);
}
// Overloaded << operator.
friend std::ostream& operator<<(std::ostream& os, const Person& person)
{
os << person.first_name << ", " << person.last_name << ", " << person.age << "\n";
return os;
}
friend std::string to_string(const Person& obj)
{
std::ostringstream ss;
ss << obj;
return ss.str();
}
};
std::vector<Person*> getVector(const std::vector<std::shared_ptr<Person>>& people);
int main(void)
{
Person person01;
person01.first_name = "Ashley";
person01.last_name = "Graham";
person01.age = 23;
Person person02;
person02.first_name = "Ada";
person02.last_name = "Wong";
person02.age = 45;
Person person03;
person03.first_name = "Leon S.";
person03.last_name = "Kennedy";
person03.age = 26;
std::shared_ptr<Person> ps01 = std::make_shared<Person>(person01);
std::shared_ptr<Person> ps02 = std::make_shared<Person>(person02);
std::shared_ptr<Person> ps03 = std::make_shared<Person>(person03);
std::vector<std::shared_ptr<Person>> peoples;
peoples.emplace_back(std::move(ps01));
peoples.emplace_back(std::move(ps02));
peoples.emplace_back(std::move(ps03));
std::cout << "\nContent of input vector:\n";
std::cout << "====================================\n";
for (auto p : peoples)
{
std::cout << *p;
}
std::cout << "\n";
std::cout << "Calling function 'getVector()'...\n";
std::vector<Person*> result = getVector(peoples);
std::cout << "\nContent of result-vector:\n";
std::cout << "====================================\n";
for (auto r : result)
{
std::cout << *r;
}
std::cout << "\n";
return 0;
}
// std::transform with std::mem_fn.
std::vector<Person*> getVector(const std::vector<std::shared_ptr<Person>>& people)
{
Person* person;
std::shared_ptr<Person> p;
std::vector<Person*> result;
std::transform(people.begin(), people.end(), std::back_inserter(result),
std::bind1st(std::mem_fn(&Person::getPerson), &p));
return result;
}
g++ -std=c++11 -Wall -Wextra main.cpp -o main
最佳答案
只需使用lambda。它使代码更容易理解,您可以摆脱GetPerson
函数。这样做会使您的转换调用看起来像
std::transform(people.begin(),
people.end(),
std::back_inserter(result),
[](const auto& elem){ return elem.get(); });
关于c++ - 如何正确使用std::transform和std::mem_fn?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59617890/
这是一个后续问题 mem_fn to function of member object 这是当前代码。 #include #include #include struct Int {
KDE/PIM Zanshin 项目在其代码中的多个位置使用了 std::mem_fn,结果证明至少有 1 个版本的 Apple clang(随 OS X 10.9 提供的最新 Xcode 提供的版本
我很困惑为什么需要 std::mem_fn。 我有一个函数接受任何可调用对象(lambda、函数指针等),并将其绑定(bind)到一个参数。 例如: template void Class::DoBi
我正在修补 std::mem_fn,但无法设法将其绑定(bind)到结构成员的数据/函数(更深一层)。 我希望代码能比我描述的更好地说明问题,因为我不熟悉术语。 #include struct In
编译以下代码时,Visual Studio报告: \main.cpp(21): error C2664: 'std::_Call_wrapper,false> std::mem_fn(int Clas
我已经实现了一个C++程序,该程序创建了三个不同的Person对象。这些对象被共享并存储在 vector 中。 函数getVector()以const std::vector>&作为输入并返回std:
我有以下片段: struct Foo { Foo(int num):num_(num){} void print_add(int i) const { std::cout vpf{
我有一个更复杂的包装类版本,它封装了如下用户类型的 std::vector。 struct UserType1Encapsulator { template UserType1Encap
我可以用 C++ 实现以下功能吗?在调用回调方法之前,我想保持未指定 myInstance 变量,而不是将其包含在 boost::bind 实例中。 MyClass *myInstance; void
我有一个带有默认参数的成员函数的类。 struct Class { void member(int n = 0) {} }; 通过 std::tr1::mem_fn 我可以调用它: C
编译以下代码时,Visual Studio 报告: \main.cpp(21): error C2664: 'std::_Call_wrapper,false> std::mem_fn(int Cla
有人可以推荐 tr1 的 mem_fn 和绑定(bind)实用程序的一些很酷的实际用途吗?我不需要深奥的 c++ 来开发库。只是一些利用这些的应用程序级编码。 任何帮助将不胜感激。 最佳答案 我已将
考虑这个人为的例子: template void funny_transform(Iter first, Iter last, vector& v) { transform(first, la
考虑 the following code : struct A { int& getAttribute(); const int& getAttribute() const; };
这是由于 mem_fn() 的实现没有定义 __forceinline/inline/__attribute__((always_inline)) 造成的吗?是否可以解决这个问题,例如使用自己的 me
我正在使用 C++11 和 MSVC2013 尝试在我的类中使用函数指针来拥有自己的成员函数。 class MyClass { public: // ... QColor Co
auto 很好,但我需要在类中声明一个成员,而不是堆栈中的变量。 decltype 有效,但不知何故看起来很奇怪 class Automation { void _init_state(int
我想把这个结果: std::tr1::mem_fn(&ClassA::method); 在一个变量中,这个变量的类型是什么? 看起来像这样: MagicalType fun = std::tr1::m
我理解在其类之外传递成员函数地址的基本问题。我觉得 mem_fn() 可能是解决方案,但我在具体细节上遇到了麻烦。 我在类 p 中有一个成员函数,当前声明为 typedef void (*valNam
我有以下代码: #include struct X { int get() const& { return 42; } }; template std::result
我是一名优秀的程序员,十分优秀!