2009-05-25 2 views
8

Я хотел бы посмотреть, как этот пример существующего кода сможет воспользоваться функцией списка инициализаторов C++ 0x.Пример списка инициализаторов 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: ") 
    }; 

Или он должен иметь литералов как это ?:

example2:

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

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

ответ

9

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

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

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

+0

Если вы используете std :: vector , вы не можете добавить AskString! – mmmmmmmm

+0

Я думал, что AskString была функцией, которая возвращала Ask, глупый. – rlbond

+0

Это очень неправильно. AskString - это отдельный тип, который использует Ask как базовый класс. То, что вы называете функцией, является конструктором. Они очень разные. – jmucchiello

Смежные вопросы