は、次のクラスを考えてみましょう: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_;
};
ものchar *データの配列を以下の点を考慮:
char STUDENT_NAMES[][20] = {
"Bart",
"Liza",
"Maggie"
};
今、私はこの配列に基づいて人のSTD ::リストを作成したいです。 私が考案可能性すべてはSTDを使用することです::手書き 関数オブジェクトに変換アルゴリズムを:
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());
// ...
は、任意の短くおよび/または明確な方法はそれを行うにはありますか?たぶん標準の 関数オブジェクトまたはアダプタですか?
私は、この配列のCALCSは最終的に、今ある願っています。どのようなタイプのものが得られるかについて私の答えで私が一時的に何を持っていたのか、私の愚痴を無視してください。 Srsly、朝の配列haxは私の脳を傷つける:)しかし、私は 'STUDENT_NAMES'を' char const * names [] = {"Bart"、 "Lisa"、...}; 'にすることをお勧めしますもはや20文字制限をオーバーフローさせることはできません。私はあなたのコードベースを知っているわけではありません。あなたがそうする強い理由はありましたか? –
あなたのソリューションはよく見えます、ありがとう! アレイのサイズについて。あなたの提案に感謝しますが、それは問題のポイントではありません。私の例は文脈から取り除かれ、理解を容易にするために書き直されています。 :) – Michael
@litb:_const_ char names [] [20]はデータの再配置を起こさないため、データはEPROMなどの読み取り専用メモリに格納されます。他にも_const_char * names []でも再配置が必要です(ポインタの配列であり、それらのポインタを再配置する必要があります): http://people.redhat.com/drepper/dsohowto.pdf –