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

时间:2009-07-13 11:38:43

标签: c++ stl functional-programming

考虑以下课程:

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_;
};

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

char STUDENT_NAMES[][20] = {
    "Bart",
    "Liza",
    "Maggie"
};

现在,我想根据这个数组创建std :: 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() );
// ...

是否有更短和/或更清晰的方式来做它?也许有些标准 函数对象或适配器?

4 个答案:

答案 0 :(得分: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>());
}

我认为标准C ++库没有这种方法。

答案 1 :(得分:2)

您的类'构造函数是转换函数。你不需要改变:你可以插入。看看this code here

std::list<Person> ps( NAMES, NAMES+sizeof(NAMES)/sizeof(NAMES[0]) );

否则,较短的解决方法是使用静态工厂函数:

struct Person {
    static Person create( const char* name );
     ....
 };

 std::transform( NAMES, NAMES+sizeof(NAMES)/sizeof(NAMES[0], front_inserter( ps ),
   &Person::create );

答案 2 :(得分:0)

没什么帮助,但是没有标准的ELEMENTS宏

   sizeof(STUDENT_NAMES)/sizeof(STUDENT_NAMES[0])

快速搜索没有找到它,但我觉得我使用的每个实现都有它。

我只有其他建议就是将CreatePerson变成一个模板 - 这样,如果你再次需要它,你只需要做CreateObj或类似的东西。

答案 3 :(得分:-1)

好吧,我将编写一个方法/函数,如:

convert(const char*[] names, std::list<Person>&);

为什么不进行简单的转换呢?也许我错过了这一点?

M2C