考虑以下课程:
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() );
// ...
是否有更短和/或更清晰的方式来做它?也许有些标准 函数对象或适配器?
答案 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