Пример списка инициализаторов C ++ 0x - PullRequest
8 голосов
/ 25 мая 2009

Я хотел бы посмотреть, как этот пример существующего кода сможет воспользоваться преимуществом списка инициализаторов C ++ 0x.

Example0:

#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: "));
}

Будет ли это поддерживать что-то вроде этого:

Example1:

std::vector<Ask*> ui ={
    AskString("Enter your name: ", 3, 25),
    AskString("Enter your city: ", 2, 25),
    Ask("Enter your age: ")
    };

Или у него должны быть такие литералы?:

Пример2:

std::vector<Ask*> ui ={
    {"Enter your name: ", 3, 25},
    {"Enter your city: ", 2, 25},
    {"Enter your age: "}
    };

Если так, как будет обрабатываться разница между AskString и Ask?

Ответы [ 2 ]

9 голосов
/ 25 мая 2009

Ваши последние примеры не будут разрешены, поскольку вы запрашиваете указатели, но вместо этого попробуйте предоставить локальные временные объекты.

std::vector<Ask*> ui ={
    new AskString{"Enter your name: ", 3, 25},
    new AskString{"Enter your city: ", 2, 25},
    new Ask{"Enter your age: "}
    };

Это было бы разрешено, и не было бы никакой двусмысленности типа.

Это тоже было бы правильно:

std::vector<Ask*> ui ={
        new AskString("Enter your name: ", 3, 25),
        new AskString("Enter your city: ", 2, 25),
        new Ask("Enter your age: ")
        };

А ваш пример больше похож на:

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}
    };

и снова не будет никакой двусмысленности в типах.

0 голосов
/ 25 мая 2009

Список инициализаторов c ++: homogenous , что означает, что он должен иметь одинаковый тип, поэтому пример № 2 отсутствует. Если бы вы использовали new в примере 1, это сработало бы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...