Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

C++17 Чтение вектора элементов типа any

Роман Protocol Мыслитель (8562), закрыт 5 лет назад
Всем привет!
Как правильно записать cout << any_cast<*type_checking>(t); передачу хранимого типа текущим any в строке 37. Запись, что я привёл - не верна.
https://pastebin.com/NSaMDJd4
Тип any знает какого типа значение он содержит. Почему нужно руками в шаблон указать тип?
Спасибо за ответы!
Лучший ответ
Николай Веселуха Высший разум (356528) 5 лет назад
#include <iostream>
#include <any>
#include <vector>
#include <string>
using namespace std;
class User {
public:
User() : name_("Unknown"s) {}
explicit User(string&& name) : name_(name) {}
string get()const { return name_; }
void set(const string& name) { name_ = name; }
private:
string name_;
friend ostream& operator<<(ostream& out, const User& user) {
out << user.name_;
return out;
}
};
struct Bad {};
int main() {
vector<any> box;
box.emplace_back(any(15));
box.emplace_back(any(1.3));
box.emplace_back(any('w'));
box.emplace_back(any("Hello world!"s));
box.emplace_back(any(User("Roman Protocol"s)));
box.emplace_back(any(Bad()));
for (const auto &item : box) {
if (item.type() == typeid(int)) {
cout << "Integer: " << any_cast<int>(item);
} else if (item.type() == typeid(double)) {
cout << "Real: " << any_cast<double>(item);
} else if (item.type() == typeid(char)) {
cout << "Character: " << any_cast<char>(item);
} else if (item.type() == typeid(string)) {
cout << "Line: " << any_cast<string>(item);
} else if (item.type() == typeid(User)) {
cout << "Name: " << any_cast<User>(item);
} else {
cout << "Unknown type!";
}
cout.put('\n');
}
system("pause");
}
Miku HatsuneМудрец (11188) 5 лет назад
Как ты сделал отступы?
Николай Веселуха Высший разум (356528) &nbsp;
DmitryПросветленный (22264) 5 лет назад
И как заголовки?
Miku Hatsune Мудрец (11188) Ну с заголовками просто Без пробелов & gt ; > & lt ; <
Роман ProtocolМыслитель (8562) 5 лет назад
Спасибо за код.
Николай Веселуха Высший разум (356528) Пожалуйста.
Роман ProtocolМыслитель (8562) 5 лет назад
Ещё вопрос:
Мне друг, пишущий на C++, говорил, что один раз использовал много else if пристроек к if и у него началось выполнение нужно if, а также остальных else if хоть и условие не соблюдалось в них. Друг сказал, что если конструкция состоит из множества else if, то компилятор представляет это в виде switch и отсутствие break; позволяет выполнять компилятором не только нужный if else, а все else if после нужного, включая нужный, и так до конца конструкции.
Мне как - то в это не верится. В if нельзя ставить break; если if вне тела цикла. switch не может обрабатывать классы. Или друг прав, такое могло произойти?
Вы что можете сказать по этой ситуации?
Николай Веселуха Высший разум (356528) Фтопку такой компилятор со своей безумной оптимизацией. Это switch нужно разворачивать в блоки if-else, а не наоборот
Остальные ответы
Miku Hatsune Мудрец (11188) 5 лет назад
any_cast<*type_checking>(t);
Ну конечно же, так нельзя. Все, что находится в треугольных скобках в С++ должно быть вычислимым на этапе компиляции. В твоем случае, это не так.

Тип std::any не предназначен для подобных фокусов. Тип этот необходим для передачи данных между методами, когда отдающий и принимающий методы обязательно знают, какого типа это значение, но в то же время промежуточный метод знать тип не обязан.
Считай это типо-безопасной заменой void*. Ты же не можешь автоматически определить реальный тип void*, верно? Вот то же самое и невозможно с std::any.

К слову, та мешанина из костылей, которая предоставлена в твоем коде, была той причиной, по которой я была против введения std::any в стандарт, но это случилось. Увы и ах.
Кууча фон ЮчаГуру (3938) 5 лет назад
Было офигенное сишное приведение (type). Нет, эти засранцы сказали "неэффективно"...
Miku Hatsune Мудрец (11188) Так пиши на С, кто тебе запрещает? Тем более, сишный каст в плюсах пока работает, к чему ты это сказал?
Похожие вопросы