Всем привет!
Как правильно записать cout << any_cast<*type_checking>(t); передачу хранимого типа текущим any в строке 37. Запись, что я привёл - не верна.
https://pastebin.com/NSaMDJd4
Тип any знает какого типа значение он содержит. Почему нужно руками в шаблон указать тип?
Спасибо за ответы!
Другие языки программирования и технологии
C++17 Чтение вектора элементов типа any
#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");
}
#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");
}
any_cast<*type_checking>(t);
Ну конечно же, так нельзя. Все, что находится в треугольных скобках в С++ должно быть вычислимым на этапе компиляции. В твоем случае, это не так.
Тип std::any не предназначен для подобных фокусов. Тип этот необходим для передачи данных между методами, когда отдающий и принимающий методы обязательно знают, какого типа это значение, но в то же время промежуточный метод знать тип не обязан.
Считай это типо-безопасной заменой void*. Ты же не можешь автоматически определить реальный тип void*, верно? Вот то же самое и невозможно с std::any.
К слову, та мешанина из костылей, которая предоставлена в твоем коде, была той причиной, по которой я была против введения std::any в стандарт, но это случилось. Увы и ах.
Ну конечно же, так нельзя. Все, что находится в треугольных скобках в С++ должно быть вычислимым на этапе компиляции. В твоем случае, это не так.
Тип std::any не предназначен для подобных фокусов. Тип этот необходим для передачи данных между методами, когда отдающий и принимающий методы обязательно знают, какого типа это значение, но в то же время промежуточный метод знать тип не обязан.
Считай это типо-безопасной заменой void*. Ты же не можешь автоматически определить реальный тип void*, верно? Вот то же самое и невозможно с std::any.
К слову, та мешанина из костылей, которая предоставлена в твоем коде, была той причиной, по которой я была против введения std::any в стандарт, но это случилось. Увы и ах.
Дмитрий Скибо
Было офигенное сишное приведение (type). Нет, эти засранцы сказали "неэффективно"...
Похожие вопросы
- C++ Как вывести вектор на экран и вообще обращаться к нему?
- C++ Нужно вычислить сумму элементов массива, расположенных между первым и последним отрицательными элементами.
- C++ как обратиться к элементу находящемуся в privatе? компилятор выдает ошибку
- c++ помогите найти сумму элементов на главной диагонали?
- c++, как отрандомить случайное число типа float в диапазоне от 0 до 10 ? (пример - 0,42; 7,71)
- Алгоритмы стандартной библиотеки шаблонов. Вектора в C++.
- Паскаль! Даны векторы: a={xn}, b={yn}, c={zn}, d={dn}. Построить матрицу К, сторонами которой являются упорядочены в
- Помогите испрвить код Переписать первые элементы каждой строки матрицы a(n*m), больше некоторого числа C, в массив b .
- C++ Сортировка в сортировке вектора экземпляров структуры
- Вычислить сумму элементов массива, расположенных между первым и вторым отрицательными элементами - C++
Мне друг, пишущий на C++, говорил, что один раз использовал много else if пристроек к if и у него началось выполнение нужно if, а также остальных else if хоть и условие не соблюдалось в них. Друг сказал, что если конструкция состоит из множества else if, то компилятор представляет это в виде switch и отсутствие break; позволяет выполнять компилятором не только нужный if else, а все else if после нужного, включая нужный, и так до конца конструкции.
Мне как - то в это не верится. В if нельзя ставить break; если if вне тела цикла. switch не может обрабатывать классы. Или друг прав, такое могло произойти?
Вы что можете сказать по этой ситуации?