Пример списка инициализаторов C++0x
-
05-09-2019 - |
Вопрос
Мне хотелось бы посмотреть, как этот пример существующего кода сможет воспользоваться преимуществами функции списка инициализаторов 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?
Решение
Ваши последние примеры не будут разрешены, поскольку вы запрашиваете указатели, но вместо этого пытаетесь предоставить локальные временные объекты.
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}
};
и снова не было бы никакой двусмысленности в типах.
Другие советы
Список инициализаторов С++ однородный, то есть все они должны иметь один и тот же тип, поэтому пример №2 исключен.Если вы использовали new
в примере 1 это сработает.