Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760

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

31.03.2017, 14:40. Показов 1367. Ответов 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 / 3204 / 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 / 3204 / 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Angular: Вопросы и ответы на собеседовании
Reangularity 15.06.2025
Готовишься к техническому интервью по Angular? Я собрал самые распространенные вопросы, с которыми сталкиваются разработчики на собеседованиях в этом году. От базовых концепций до продвинутых. . .
Архитектура Onion в ASP.NET Core MVC
stackOverflow 15.06.2025
Что такое эта "луковая" архитектура? Термин предложил Джеффри Палермо (Jeffrey Palermo) в 2008 году, и с тех пор подход только набирал обороты. Суть проста - представьте себе лук с его. . .
Unity 4D
GameUnited 13.06.2025
Четырехмерное пространство. . . Звучит как что-то из научной фантастики, правда? Однако для меня, как разработчика со стажем в игровой индустрии, четвертое измерение давно перестало быть абстракцией из. . .
SSE (Server-Sent Events) в ASP.NET Core и .NET 10
UnmanagedCoder 13.06.2025
Кажется, Microsoft снова подкинула нам интересную фичу в новой версии фреймворка. Работая с превью . NET 10, я наткнулся на нативную поддержку Server-Sent Events (SSE) в ASP. NET Core Minimal APIs. Эта. . .
С днём независимости России!
Hrethgir 13.06.2025
Решил побеседовать, с утра праздничного дня, с LM о завоеваниях. То что она написала о народе, представителем которого я являюсь сам сначала возмутило меня, но дальше только смешило. Это чисто. . .
Лето вокруг.
kumehtar 13.06.2025
Лето вокруг. Наполненное бурями и ураганами событий. На фоне магии Жизни, священной и вечной, неумелой рукой человека рисуется панорама душевного непокоя. Странные серые краски проникают и. . .
Популярные LM модели ориентированы на увеличение затрат ресурсов пользователями сгенерированного кода (грязь -заслуги чистоплюев).
Hrethgir 12.06.2025
Вообще обратил внимание, что они генерируют код (впрочем так-же ориентированы разработчики чипов даже), чтобы пользователь их использующий уходил в тот или иной убыток. Это достаточно опытные модели,. . .
Топ10 библиотек C для квантовых вычислений
bytestream 12.06.2025
Квантовые вычисления - это та область, где теория встречается с практикой на границе наших знаний о физике. Пока большая часть шума вокруг квантовых компьютеров крутится вокруг языков высокого уровня. . .
Dispose и Finalize в C#
stackOverflow 12.06.2025
Работая с C# больше десяти лет, я снова и снова наблюдаю одну и ту же историю: разработчики наивно полагаются на сборщик мусора, как на волшебную палочку, которая решит все проблемы с памятью. Да,. . .
Повышаем производительность игры на Unity 6 с GPU Resident Drawer
GameUnited 11.06.2025
Недавно копался в новых фичах Unity 6 и наткнулся на GPU Resident Drawer - штуку, которая заставила меня присвистнуть от удивления. По сути, это внутренний механизм рендеринга, который автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru