Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ STL中是否有创建对象的函数对象?_C++_Stl_Functional Programming - Fatal编程技术网

C++ STL中是否有创建对象的函数对象?

C++ STL中是否有创建对象的函数对象?,c++,stl,functional-programming,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] = { "

考虑以下类别:

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::list 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() );
// ...
struct CreatePerson:public std::一元函数{
Person运算符()(常量字符*名称)常量{
返回人(姓名);
};
};
// ...
学生名单;
std::transform(
&学生姓名[0],
&(学生姓名[sizeof(学生姓名)/sizeof(学生姓名[0]),
前插入器(学生),
CreatePerson());
// ...
有没有更短和/或更清晰的方法?也许是一些标准 功能对象或适配器?

您可以按以下方式使用:

#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>());
}
#包括
#包括
#包括
#包括
#包括
#包括
结构人{
显式人员(字符常量*名称)
:name(name){}
私人:
std::字符串名;
};
int main(){
字符名称[][20]={
“迈克尔”,“利特”
};
标准:清单五;
std::transform(名称,名称+2,std::前端插入器(v),
boost::lambda::constructor());
}

我不认为有这样的方式与标准C++库。 没有太多帮助,但是没有宏的标准元素吗

   sizeof(STUDENT_NAMES)/sizeof(STUDENT_NAMES[0])
快速搜索没有找到它,但我觉得我使用的每个实现都有它


我唯一的另一个建议是将CreatePerson转换为模板——这样,如果您再次需要它,您只需执行CreateObj或类似操作。

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

convert(const char*[] names, std::list<Person>&);
convert(const char*[]名称,std::list&);
为什么不做一个简单的转换呢?也许我没抓住重点


m2c

类的构造函数是一个转换函数。您不需要变换:只需插入即可。看一看


我希望这个数组的计算现在终于完成了。“忽略我的哑巴”在我的回答中提到了关于什么产生了什么类型的问题。同样,早上的数组hax伤害了我的大脑:)然而,我仍然建议你制作
STUDENT_name
a
char const*NAMES[]={“Bart”、“Lisa”、…}-这样它就不能再超过20个字符的限制了。但是我不知道你的代码库。你这样做有充分的理由吗?你的解决方案看起来不错,谢谢!关于数组大小。谢谢你的建议,但这不是问题的关键。我的例子断章取义,为了便于理解而重写。:)@litb:const char names[][20]不会对数据进行重新定位,因此允许数据位于只读内存(如EPROM)中。OTHO,即使const char*names[]也需要重新定位(这是一个指针数组,这些指针需要重新定位):#包括std::transform(boost::begin(names),boost::end(names),…:)重点在于重用标准库中定义的迭代代码。“algorithm”(算法)标题包含大量用于非常常见的迭代任务的有用函数,这些函数不限于列表、向量、数组,而是使用“迭代器”。@xtofl:是的,我同意。我的观点是,这种情况下的附加值并不明显,因为在给定的示例中,您必须在Person类范围之外编写一元函数,这只是为了应用标准变换算法。您的解决方案(使用构造器)非常好,而且在那里转换的使用看起来很干净。但是写一个一元数只是为了使用转换…不,不是。请注意,我的构造函数是显式的。使用static create()的第二个示例确实可以很好地工作,但它是我采用的唯一好看的示例。您刚刚将功能从函子移到了静态方法。无论如何,谢谢你。我想看到的是一种直接创建对象的方法。现在在我看来,STL中没有这样的能力。你是完全正确的。你要求了一个更好的方法——不仅仅是一点点:你不需要额外的函子。
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 );