C ++ 0x initialiseur exemple de liste
-
05-09-2019 - |
Question
Je voudrais voir comment cet exemple de code existant serait en mesure de tirer profit du C ++ 0x fonction de la liste d'initialisation.
Exemple0:
#include <vector>
#include <string>
struct Ask {
std::string prompt;
Ask(std::string a_prompt):prompt(a_prompt){}
};
struct AskString : public Ask{
int min;
int max;
AskString(std::string a_prompt, int a_min, int a_max):
Ask(a_prompt), min(a_min), max(a_max){}
};
int main()
{
std::vector<Ask*> ui;
ui.push_back(new AskString("Enter your name: ", 3, 25));
ui.push_back(new AskString("Enter your city: ", 2, 25));
ui.push_back(new Ask("Enter your age: "));
}
Ne serait-il soutenir quelque chose comme ceci:
Example1:
std::vector<Ask*> ui ={
AskString("Enter your name: ", 3, 25),
AskString("Enter your city: ", 2, 25),
Ask("Enter your age: ")
};
Ou doit-il avoir littéraux comme ceci:
Example2:
std::vector<Ask*> ui ={
{"Enter your name: ", 3, 25},
{"Enter your city: ", 2, 25},
{"Enter your age: "}
};
Si oui, comment la différence entre AskString et Ask manipuler?
La solution
Vous derniers exemples ne serait pas autorisé que vous demandez des pointeurs mais essayez de fournir des objets temporaires locaux à la place.
std::vector<Ask*> ui ={
new AskString{"Enter your name: ", 3, 25},
new AskString{"Enter your city: ", 2, 25},
new Ask{"Enter your age: "}
};
Ce serait permis et il n'y aurait pas d'ambiguïté de type.
Ce serait bien aussi:
std::vector<Ask*> ui ={
new AskString("Enter your name: ", 3, 25),
new AskString("Enter your city: ", 2, 25),
new Ask("Enter your age: ")
};
Et votre exemple est plus comme:
std::vector<Ask> ui ={ // not pointers
{"Enter your name: "},
{"Enter your city: "},
{"Enter your age: "}
};
std::vector<AskString> uiString ={ // not pointers
{"Enter your name: ", 3, 25},
{"Enter your city: ", 2, 25},
{"Enter your age: ", 7, 42}
};
et encore il n'y aurait pas d'ambiguïté sur les types.
Autres conseils
A c ++ liste initialiseur est homogène , ce qui signifie qu'il doit avoir tout le même type, donc par exemple # 2 est sorti. Si vous avez utilisé new
dans l'exemple 1, il travaillerait.