是否有任何函数对象在STL中创建对象?

Mic*_*ael 2 c++ functional-programming stl

考虑以下课程:

class Person {
public:
    // I don't want any "char *" to be converted to Person implicitly!
    explicit Person( const char * name ) : name_(name) {};

private:
    std::string name_;
};
Run Code Online (Sandbox Code Playgroud)

还要考虑以下char*数据数组:

char STUDENT_NAMES[][20] = {
    "Bart",
    "Liza",
    "Maggie"
};
Run Code Online (Sandbox Code Playgroud)

现在,我想根据这个数组创建std :: Person of Person.我所能发明的是使用std :: transform算法和手写函数对象:

struct CreatePerson : public std::unary_function<const char*,Person> {
    Person operator() (const char * name) const {
        return Person(name);
    };
};

// ...

std::list<Person> students;
std::transform(
    &STUDENT_NAMES[ 0 ],
    &(STUDENT_NAMES[ sizeof(STUDENT_NAMES)/sizeof(STUDENT_NAMES[0]) ]),
    front_inserter(students),
    CreatePerson() );
// ...
Run Code Online (Sandbox Code Playgroud)

有没有更简短和/或更清晰的方法呢?也许一些标准的功能对象或适配器?

Joh*_*itb 5

您可以通过boost::lambda以下方式使用:

#include <boost/lambda/lambda.hpp>
#include <boost/lambda/construct.hpp>
#include <string>
#include <iterator>
#include <algorithm>
#include <list>

struct person {
  explicit person(char const *name)
   :name(name) { }
private:
  std::string name;
};

int main() {
  char names[][20] = {
    "Michael", "litb"
  };

  std::list<person> v;
  std::transform(names, names + 2, std::front_inserter(v), 
    boost::lambda::constructor<person>());
}
Run Code Online (Sandbox Code Playgroud)

我不认为标准C++库有这样的方法.