Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760

Как проинициализировать std::stack<const int> obj ( std::stack<int>{} );

31.03.2017, 14:40. Показов 1556. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
добрый день.

вопрос в коде:

http://rextester.com/VCVVML6656

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <stack>
 
//-std=c++14 -fopenmp -O2 -g3 -pedantic -Wall -Weffc++ -Wextra 
//-Woverloaded-virtual -Wctor-dtor-privacy -Wnon-virtual-dtor 
//-Wold-style-cast -Wconversion -Wsign-conversion -Winit-self 
//-Wunreachable-code
 
template<class T> struct item
{
    item(const T& v):val(v){}
    T val;
};
 
int main() 
{
    using  item_t = item<int>;
    using citem_t = item<const int>;
    
    using  stack_t = std::stack< item_t>;
    using cstack_t = std::stack<citem_t>;
    
    
    stack_t st;
    for(int n=0; n<10; ++n)
        st.push(n);
    
    // как проинициализировать "константную" 
    // версию стека от неконстантного?
    cstack_t cst(st); 
}
ну то есть понятно, что stack_t и cstack_t - два принципиально разных типа,
которые друг о друге ничего не знают.

ну как быть теперь в такой ситуации?

то есть, конечно можно std::stack - за борт,
и поюзать std::deque напрямки.
но интересно решение именно для std::stack

Добавлено через 35 минут
придумал вот такой костыль (вроде даже работает)
http://rextester.com/YNR17465

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <stack>
 
//-std=c++14 -fopenmp -O2 -g3 -pedantic -Wall -Weffc++ -Wextra 
//-Woverloaded-virtual -Wctor-dtor-privacy -Wnon-virtual-dtor 
//-Wold-style-cast -Wconversion -Wsign-conversion -Winit-self 
//-Wunreachable-code
 
template<class T> struct item
{
    operator const T&()const { return val; }
    
    item(const T& v):val(v){}
    T val;
};
 
int main() 
{
    using  item_t = item<int>;
    using citem_t = item<const int>;
    
    using  stack_t = std::stack< item_t>;
    using cstack_t = std::stack<citem_t>;
    
    stack_t st;
    for(int n=0; n<10; ++n)
        st.push(n);
    
    // расчет на то, что строение объекта у "константной" 
    // и "не константной" версии одинаковое
    cstack_t cst;   
    new(&cst) stack_t(st);
    
    while(!cst.empty())
    {
        std::cout << cst.top()<<std::endl;
        cst.pop();
    }
}
вот интересно...
насколько это потенциально опасное решение?
вы бы пропустили такое через ревью?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.03.2017, 14:40
Ответы с готовыми решениями:

Не могу разобраться как обновить в std::map<std::string, вектор_структур>
Не могу разобраться как обновить вектор структур после его добавления в map без удаления и перезаписи struct pStruct { int...

Проблема с заданием шаблона метода с параметром const std::function<T()>
Доброго времени суток! Ткните пожалуйста носом, что не так с заданием шаблона? Компилятор ругается тут: threadCreate&lt;bool&gt;(_timer,...

std::string, std::fstream, ошибка кучи
где то начало вылетать при операции += с локальной переменной std::string. Заменил на свой qString. Замечательно, то же самое... ошибка при...

10
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
31.03.2017, 16:28
Думаю честным путем это никак не сделать, т.к.
Цитата Сообщение от hoggy Посмотреть сообщение
что stack_t и cstack_t - два принципиально разных типа,
которые друг о друге ничего не знают.
У меня еще вот так на rextester.com собралось (правда с варнингами)
C++
1
cstack_t cst(*reinterpret_cast<cstack_t*>(&st));
А мой g++ 4.9.3 ругается на
C++
1
std::cout << cst.top()<<std::endl;
Bash
1
2
3
4
5
6
7
8
tmp.cpp: In function ‘int main()’:
tmp.cpp:34:30: error: cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’
         std::cout << cst.top() << std::endl;
                              ^
In file included from /usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3/include/g++-v4/iostream:39:0,
                 from tmp.cpp:1:
/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3/include/g++-v4/ostream:602:5: note: initializing argument 1 of ‘std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = item<const int>]’
     operator<<(basic_ostream<_CharT, _Traits>&& __os, const _Tp& __x)
Возможно компилятор с ума сходит, top() для не константного объекта возвращает reference, что есть const int& а нашем случае и, возможно, он не понимает как не константное может быть константным)
Цитата Сообщение от hoggy Посмотреть сообщение
вы бы пропустили такое через ревью?
Хз как оно еще может "стрельнуть", в любом случае оба решения попахивают, я бы не пропустил.

Добавлено через 2 минуты

Не по теме:

У меня как-то реджектнули код с placement new на ревью, т.к. placement new выглядит страшно и такой синтаксис мало кто знает.

0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.03.2017, 17:05  [ТС]
Цитата Сообщение от Kastaneda Посмотреть сообщение
Хз как оно еще может "стрельнуть"
сейчас это работает лишь по одной причине:
строения объектов совпадают.

только это никто как бе не гарантируется.

Цитата Сообщение от Kastaneda Посмотреть сообщение
А мой g++ 4.9.3 ругается на
как нибудь можно было бы это на онлайн-компиляторе проверить?
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
31.03.2017, 18:27
Попробовал дома тоже на 4.9.3, но на Kubuntu, все нормально. На работе Gentoo, странно, не думаю, что поведение компилятора отличается в разных дистрибутивах Linux.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
31.03.2017, 18:30
Цитата Сообщение от hoggy Посмотреть сообщение
сейчас это работает лишь по одной причине:
строения объектов совпадают.
Можно определить оператор каста/конструктор в структуре item (как в прошлой теме).
Затем у микрософта в стеке определен _Get_container(). Просто создаем deque<citem_t> копированием из st._Get_container(). И конструируем cstack_t перемещением этого дека.

В gcc, т.к. в стеке контейнер по стандарту протектед, можно применить для доступа к контейнеру паттерн Паблик Морозов.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.03.2017, 20:16  [ТС]
Цитата Сообщение от avgoor Посмотреть сообщение
Можно определить оператор каста/конструктор в структуре item (как в прошлой теме).
не поможет.

Цитата Сообщение от avgoor Посмотреть сообщение
у микрософта в стеке определен _Get_container()
не портируемо.

Цитата Сообщение от avgoor Посмотреть сообщение
Паблик Морозов
это точно никакое ревью не пройдет

я решил просто уходить со стека на какой нибудь вектор.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
31.03.2017, 22:13
Цитата Сообщение от hoggy Посмотреть сообщение
я решил просто уходить со стека на какой нибудь вектор
А почему не на дек, оберткой которого стек и является?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.03.2017, 23:17  [ТС]
Цитата Сообщение от avgoor Посмотреть сообщение
А почему не на дек, оберткой которого стек и является?
дек наверна оверкилл, для стека
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
31.03.2017, 23:21
Цитата Сообщение от hoggy Посмотреть сообщение
дек наверна оверкилл, для стека
Комитет считает иначе, ибо в стандарте стэк определен как:
C++
1
2
3
namespace std {
template <class T, class Container = deque<T> >
class stack {
Мне вообще непонятно, почему дек так редко используют.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.03.2017, 23:37  [ТС]
Цитата Сообщение от avgoor Посмотреть сообщение
Комитет считает иначе, ибо в стандарте стэк определен как:
ну и какой профит от дека при вставке в задницу?
и взятия с задницы?
1
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
31.03.2017, 23:43
hoggy, Профит в том, что память там выделяется порциями по мере надобности и при выделении ничего никуда не копируется, как при использовании вектора. А что он двусторонний - так отличия от односторонней реализации - минимальные (лишняя операция сложения).
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.03.2017, 23:43
Помогаю со студенческими работами здесь

В чем разница между long int и short int
Извините если вопрос нубский, но я ни как не могу понять смысл long int и short int. Например с unsingned все ясно. Один байт в int...

Ошибка: invalid types ‘int[int]’ for array subscript
Всем доброго дня, после компиляции выводится ошибка, которая меня вводит в ступор. #include &quot;blitz.h&quot; double dummy11 = 0.0;...

std::filesystem && std::asio и пр
Пытался найти хоть какие-то сроки включения всего этого в стандарт (так же ожидается lexical_cast, any, string_algo и т.д.) и вообщем везде...

Ошибка: E2034 Cannot convert 'int' to 'std::vector<std::vector<TRabbitCell,std::allocator<TRabbitCell>>...
Есть двухмерный вектор: std::vector&lt;std::vector&lt;TRabbitCell&gt; &gt; *cells(5, 10); Пытаюсь заполнить его объектами класса...

[bcc32 Error] File1.cpp(19): E2316 'Stack<T>::Stack()' is not a member of 'Stack<T>'
Возникает ошибка File1.cpp(19): E2316 'Stack&lt;T&gt;::Stack()' is not a member of 'Stack&lt;T&gt;' #pragma hdrstop #pragma argsused ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru