考慮下面的類:是否有任何函數對象在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(計算)現在是正確的,最後。忽略我的愚蠢提到我在回答什麼時候會產生什麼類型的問題。但是,我仍然建議你讓`STUDENT_NAMES`成爲`char const * names [] = {「Bart」,「Lisa」,...};` - 這樣它不能再溢出20個字符的限制。我不知道你的代碼庫。你是否有充分的理由這樣做? – 2009-07-13 12:01:17
您的解決方案看起來不錯,謝謝! 關於數組大小。感謝您的建議,但這不是問題所在。爲了便於理解,我的示例脫離了上下文並被重寫。 :) – Michael 2009-07-13 12:11:08
@litb:_const_ char names [] [20]不會導致數據重定位,從而允許數據存在只讀存儲器(如EPROM)中。 OTHO,即使_const_ char * names []需要重定位(它是一個指針數組,並且這些指針需要重新定位): http://people.redhat.com/drepper/dsohowto.pdf – 2009-07-13 13:04:48