170 похожих чатов

Кто в шаблонах разбирается, подскажите, пожалуйста. Я что-то нелегальное делаю? Вроде

бы обычный шаблон для разных размеров битсетов должен быть. Или для union прямо настолько жесткие ограничения?
https://godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:14,fontUsePx:'0',j:1,lang:c%2B%2B,selection:(endColumn:9,endLineNumber:30,positionColumn:9,positionLineNumber:30,selectionStartColumn:9,selectionStartLineNumber:30,startColumn:9,startLineNumber:30),source:'%23include+%3Cbitset%3E%0A%23include+%3Ciostream%3E%0Ausing+namespace+std%3B%0Aunion+move_ty+%7B%0A%09bitset+%3C2%3E+bs2%3B%0A%09bitset+%3C3%3E+bs3%3B%0A%09bitset+%3C4%3E+bs4%3B%0A%09bitset+%3C5%3E+bs5%3B%0A%7D%3B%0Aclass+unionarray_ty+%7B%0Apublic:%0A%09unionarray_ty()+%7B%7D%3B%0A%09template+%3Ctypename+T%3E%0A%09//requires+std::is_same_v%3CT,+bitset%3C2%3E%3E+%7C%7C+std::is_same_v%3CT,+bitset%3C3%3E%3E+%7C%7C+std::is_same_v%3CT,+bitset%3C4%3E%3E+%7C%7C+std::is_same_v%3CT,+bitset%3C5%3E%3E%0A%09T%26+operator%5B%5D(int+idx)+%7B%0A%09%09if+(idx+%3D%3D+0)+%7B%0A%09%09%09return+myUnion.bs2%3B%0A%09%09%7D%0A%09%09else+if+(idx+%3D%3D+1)+%7B%0A%09%09%09return+myUnion.bs3%3B%0A%09%09%7D%0A%09%09else+if+(idx+%3D%3D+2)+%7B%0A%09%09%09return+myUnion.bs4%3B%0A%09%09%7D%0A%09%09else+if+(idx+%3D%3D+3)+%7B%0A%09%09%09return+myUnion.bs5%3B%0A%09%09%7D%0A%09%7D%3B%0A%0Aprivate:%0A%09move_ty+myUnion%7B+0+%7D%3B%0A%09int+idx%7B+0+%7D%3B%0A%7D%3B%0Aint+main()%7B%0A++++unionarray_ty+u%3B%0A++++cout+%3C%3C+u%5B0%5D+%3C%3C+endl%3B%0A%7D%0A'),l:'5',n:'0',o:'C%2B%2B+source+%231',t:'0')),k:45.61787060721824,l:'4',m:100,n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:g132,deviceViewOpen:'1',filters:(b:'0',binary:'1',binaryObject:'1',commentOnly:'0',debugCalls:'1',demangle:'0',directives:'0',execute:'1',intel:'0',libraryCode:'0',trim:'1'),flagsViewOpen:'1',fontScale:14,fontUsePx:'0',j:1,lang:c%2B%2B,libs:!(),options:'-std%3Dc%2B%2B20',overrides:!(),selection:(endColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:1),l:'5',n:'0',o:'+x86-64+gcc+13.2+(Editor+%231)',t:'0')),header:(),k:36.384750998896195,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:output,i:(compilerName:'x86-64+gcc+13.2',editorid:1,fontScale:14,fontUsePx:'0',j:1,wrap:'1'),l:'5',n:'0',o:'Output+of+x86-64+gcc+13.2+(Compiler+%231)',t:'0')),k:17.997378393885562,l:'4',n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4

12 ответов

18 просмотров

Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!

А как ты этот метод собираешься инстанциировать ? template <typename T> //requires std::is_same_v<T, bitset<2>> || std::is_same_v<T, bitset<3>> || std::is_same_v<T, bitset<4>> || std::is_same_v<T, bitset<5>> T& operator[](int idx) { По параметрам это невозможно, значит, можно только лишь ЯВНО инстанциировать эту функцию при вызове, причём, надо указывать не операцию [] , а именно реализующую её функцию-член. С явным указанием параметра-типа из шаблона. А у тебя в коде не так.

М- Автор вопроса
Ilya Zviagin
А как ты этот метод собираешься инстанциировать ? ...

Тогда, наверное сделаю idx тоже шаблонным параметром и использую его для размера битсета, должно же получиться?

проблема в том, что даже после инстанцирования ( например, так u.operator[]<bitset<2>>(0) ), operator[] с подставленным типом в разных return возвращает разные типы (bitset<2>, .. bitset<5>), а это не позволено

L
проблема в том, что даже после инстанцирования ( н...

Нет это позволено, даже в в стандартной библиотеке есть куски которые вот это используют например в варианте, проблема в другом что такие функции нужно инсценировать явно, указанием в месте вызова шаблонного параметр в явном виде , но это явно не то что хотел автор

Ilya Zviagin
Нет это позволено, даже в в стандартной библиотеке...

разве это возможно? в смысле, если все шаблонные параметры инстанцированы, и при этом разные ветки return (если откинуть все ветки constexpr if и всего прочего, что можно разрешить шаблонами) возвращают разные типы, не приводимые друг к другу? разве не получается, что тип возвращаемоего значения будет зависеть от рантайм аргумента?

М- Автор вопроса
L
разве это возможно? в смысле, если все шаблонные ...

Да, это не возможно, тип возвращаемого значения зависит от рантайм аргумента. Можно было бы сделать вызовы с явным типом, что-то вроде array<bitset<2>>[0], но мне нужна работа в рантайме.

L
разве это возможно? в смысле, если все шаблонные ...

Частым применением этого является реализация собственных функции преобразования типов, как например в библиотеке Qt, при этом тип в который нужно преобразовать указывается при вызове как параметр инстанциирования шаблона функции преобразования

Это возможно и у тебя тип результата не зависит от типа аргумента , и он не определяется в рантайме

М- Автор вопроса
Ilya Zviagin
Это возможно и у тебя тип результата не зависит от...

Тип зависит от параметра, параметр известен только в рантайме, он не constexpr

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
Карта сайта