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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top