Пример списка инициализаторов C++0x

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

Пример0:

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

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

Пример1:

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?


person CW Holeman II    schedule 25.05.2009    source источник


Ответы (2)


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

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

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

person Klaim    schedule 25.05.2009

Список инициализаторов C++ является однородным, то есть он должен иметь все типы одного и того же типа, поэтому пример №2 отсутствует. Если бы вы использовали new в примере 1, это сработало бы.

person rlbond    schedule 25.05.2009
comment
Если вы используете std::vector‹Ask›, вы не сможете добавить AskString! - person mmmmmmmm; 25.05.2009
comment
Я думал, что AskString — это функция, которая возвращает Ask, глупый я. - person rlbond; 25.05.2009
comment
Это очень неправильно. AskString — это отдельный тип, который использует Ask в качестве базового класса. То, что вы называете функцией, является конструктором. Это очень разные вещи. - person jmucchiello; 25.05.2009
comment
Это неправда. Initializer_list C++ есть, но не список инициализаторов. - person Johannes Schaub - litb; 21.01.2011