Николай Веселуха
Высший разум
(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");
}
Роман ProtocolМыслитель (8562)
5 лет назад
Ещё вопрос:
Мне друг, пишущий на C++, говорил, что один раз использовал много else if пристроек к if и у него началось выполнение нужно if, а также остальных else if хоть и условие не соблюдалось в них. Друг сказал, что если конструкция состоит из множества else if, то компилятор представляет это в виде switch и отсутствие break; позволяет выполнять компилятором не только нужный if else, а все else if после нужного, включая нужный, и так до конца конструкции.
Мне как - то в это не верится. В if нельзя ставить break; если if вне тела цикла. switch не может обрабатывать классы. Или друг прав, такое могло произойти?
Вы что можете сказать по этой ситуации?
Miku Hatsune
Мудрец
(11188)
5 лет назад
any_cast<*type_checking>(t);
Ну конечно же, так нельзя. Все, что находится в треугольных скобках в С++ должно быть вычислимым на этапе компиляции. В твоем случае, это не так.
Тип std::any не предназначен для подобных фокусов. Тип этот необходим для передачи данных между методами, когда отдающий и принимающий методы обязательно знают, какого типа это значение, но в то же время промежуточный метод знать тип не обязан.
Считай это типо-безопасной заменой void*. Ты же не можешь автоматически определить реальный тип void*, верно? Вот то же самое и невозможно с std::any.
К слову, та мешанина из костылей, которая предоставлена в твоем коде, была той причиной, по которой я была против введения std::any в стандарт, но это случилось. Увы и ах.
Кууча фон ЮчаГуру (3938)
5 лет назад
Было офигенное сишное приведение (type). Нет, эти засранцы сказали "неэффективно"...
Как правильно записать cout << any_cast<*type_checking>(t); передачу хранимого типа текущим any в строке 37. Запись, что я привёл - не верна.
https://pastebin.com/NSaMDJd4
Тип any знает какого типа значение он содержит. Почему нужно руками в шаблон указать тип?
Спасибо за ответы!