бы обычный шаблон для разных размеров битсетов должен быть. Или для 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
Оберните код в теги: 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) { По параметрам это невозможно, значит, можно только лишь ЯВНО инстанциировать эту функцию при вызове, причём, надо указывать не операцию [] , а именно реализующую её функцию-член. С явным указанием параметра-типа из шаблона. А у тебя в коде не так.
Тогда, наверное сделаю idx тоже шаблонным параметром и использую его для размера битсета, должно же получиться?
Это не поможет.
проблема в том, что даже после инстанцирования ( например, так u.operator[]<bitset<2>>(0) ), operator[] с подставленным типом в разных return возвращает разные типы (bitset<2>, .. bitset<5>), а это не позволено
Нет это позволено, даже в в стандартной библиотеке есть куски которые вот это используют например в варианте, проблема в другом что такие функции нужно инсценировать явно, указанием в месте вызова шаблонного параметр в явном виде , но это явно не то что хотел автор
разве это возможно? в смысле, если все шаблонные параметры инстанцированы, и при этом разные ветки return (если откинуть все ветки constexpr if и всего прочего, что можно разрешить шаблонами) возвращают разные типы, не приводимые друг к другу? разве не получается, что тип возвращаемоего значения будет зависеть от рантайм аргумента?
Да, это не возможно, тип возвращаемого значения зависит от рантайм аргумента. Можно было бы сделать вызовы с явным типом, что-то вроде array<bitset<2>>[0], но мне нужна работа в рантайме.
Частым применением этого является реализация собственных функции преобразования типов, как например в библиотеке Qt, при этом тип в который нужно преобразовать указывается при вызове как параметр инстанциирования шаблона функции преобразования
Это возможно и у тебя тип результата не зависит от типа аргумента , и он не определяется в рантайме
Тип зависит от параметра, параметр известен только в рантайме, он не constexpr
Обсуждают сегодня