Variadic parametrli paketlar bilan birlashtirilgan shablon sinfini qanday takrorlash kerak

kalit so'zidan foydalanib, ichki jadvallar sinfini taxallus qiladigan biron bir usul bormi? Shunga o'xshash narsa

template 
struct Something {
    template 
    struct Another {};
};

template 
template 
using Something_t = typename Something::template Another;

int main() {
    Something_t{};
    return 0;
}

Ushbu javob buni amalga oshiradi, lekin agar parametr paketlari ikkalasi ham o'zgarmas bo'lsa, unda kompilyator qaerdan boshlanadi va tur ro'yxatini qaerdan tugatishni bilmaydi.

10
@LmTinyToon Chunki u qiziquvchan ...: P
qo'shib qo'ydi muallif 101010, manba
@LmTinyToon Chunki u qiziquvchan ...: P
qo'shib qo'ydi muallif 101010, manba
@LmTinyToon Chunki u qiziquvchan ...: P
qo'shib qo'ydi muallif 101010, manba
@LmTinyToon Bu holda, buni qilish mumkin, lekin bu narsa, deb o'ylayman.
qo'shib qo'ydi muallif Curious, manba
@LmTinyToon Bu holda, buni qilish mumkin, lekin bu narsa, deb o'ylayman.
qo'shib qo'ydi muallif Curious, manba
@LmTinyToon Bu holda, buni qilish mumkin, lekin bu narsa, deb o'ylayman.
qo'shib qo'ydi muallif Curious, manba
@cdhowie siz ularni ajratish uchun turlar ro'yxatlari orasidagi chegarani bildirasiz?
qo'shib qo'ydi muallif Curious, manba
@cdhowie siz ularni ajratish uchun turlar ro'yxatlari orasidagi chegarani bildirasiz?
qo'shib qo'ydi muallif Curious, manba
@cdhowie siz ularni ajratish uchun turlar ro'yxatlari orasidagi chegarani bildirasiz?
qo'shib qo'ydi muallif Curious, manba
Nima uchun bunday muayyan yo'l kerak? Kodni biroz o'zgartirishi va shu kabi kodni ishlatishi mumkin Something_t :: Something2
qo'shib qo'ydi muallif LmTinyToon, manba
Nima uchun bunday muayyan yo'l kerak? Kodni biroz o'zgartirishi va shu kabi kodni ishlatishi mumkin Something_t :: Something2
qo'shib qo'ydi muallif LmTinyToon, manba
Nima uchun bunday muayyan yo'l kerak? Kodni biroz o'zgartirishi va shu kabi kodni ishlatishi mumkin Something_t :: Something2
qo'shib qo'ydi muallif LmTinyToon, manba
Boshqa taxallusni bilmayman, biroq cheklovchi turini qo'llagan holda, eski maktabni tuzilgan usul yordamida o'xshash narsalar yaratishingiz mumkin.
qo'shib qo'ydi muallif cdhowie, manba
Boshqa taxallusni bilmayman, biroq cheklovchi turini qo'llagan holda, eski maktabni tuzilgan usul yordamida o'xshash narsalar yaratishingiz mumkin.
qo'shib qo'ydi muallif cdhowie, manba
@Kerakli o'ng. Men namunani ishlashga harakat qilyapman.
qo'shib qo'ydi muallif cdhowie, manba
@Kerakli o'ng. Men namunani ishlashga harakat qilyapman.
qo'shib qo'ydi muallif cdhowie, manba
@Kerakli o'ng. Men namunani ishlashga harakat qilyapman.
qo'shib qo'ydi muallif cdhowie, manba
Misol uchun, std :: tuple o'rniga shablonini struct pack .
qo'shib qo'ydi muallif cdhowie, manba
Misol uchun, std :: tuple o'rniga shablonini struct pack .
qo'shib qo'ydi muallif cdhowie, manba
Misol uchun, std :: tuple o'rniga shablonini struct pack .
qo'shib qo'ydi muallif cdhowie, manba
Boshqa taxallusni bilmayman, biroq cheklovchi turini qo'llagan holda, eski maktabni tuzilgan usul yordamida o'xshash narsalar yaratishingiz mumkin.
qo'shib qo'ydi muallif cdhowie, manba

6 javoblar

Siz nima deb so'raganingizni emas, balki ... agar siz turli xil ro'yxatlaringizni kataklarning argumentlari sifatida (yoki shunga o'xshash sinflarni) o'rab olsangiz ...

#include 

template 
struct Something
 {
   template 
   struct Another {};
 };

template 
struct variadicWrapper;

template 
struct variadicWrapper, std::tuple>
 { using type = typename Something::template Another; };

template 
using Something_t = typename variadicWrapper::type;

int main()
 {
   Something_t, std::tuple>{};
 }
2
qo'shib qo'ydi

Siz nima deb so'raganingizni emas, balki ... agar siz turli xil ro'yxatlaringizni kataklarning argumentlari sifatida (yoki shunga o'xshash sinflarni) o'rab olsangiz ...

#include 

template 
struct Something
 {
   template 
   struct Another {};
 };

template 
struct variadicWrapper;

template 
struct variadicWrapper, std::tuple>
 { using type = typename Something::template Another; };

template 
using Something_t = typename variadicWrapper::type;

int main()
 {
   Something_t, std::tuple>{};
 }
2
qo'shib qo'ydi

Siz nima deb so'raganingizni emas, balki ... agar siz turli xil ro'yxatlaringizni kataklarning argumentlari sifatida (yoki shunga o'xshash sinflarni) o'rab olsangiz ...

#include 

template 
struct Something
 {
   template 
   struct Another {};
 };

template 
struct variadicWrapper;

template 
struct variadicWrapper, std::tuple>
 { using type = typename Something::template Another; };

template 
using Something_t = typename variadicWrapper::type;

int main()
 {
   Something_t, std::tuple>{};
 }
2
qo'shib qo'ydi

Mustaqil javob emas, balki max66 javobiga qo'shimcha:

sinab ko'ring bo'lishi mumkin:

template
using Alias = typename Something::Another;

Avvaliga, albatta, go'zal ko'rinadi, shunday emasmi?

Ammo, muammo faqat bir shablon parametri bilan bo'ladi:

Alias a;

Which one is it now? Something::Another<> or Something<>::Another? And if you have more parameters, how to distribute? No chance to get a meaningful solution. So no, you can't do that directly, you have to help yourself with tricks such as max66 proposed...

0
qo'shib qo'ydi
O'zi juda yaxshi biladi, bu ishlamaydi. Savolga ko'ra ...
qo'shib qo'ydi muallif Barry, manba
U yomon sintaksisi (ikki shabloni parametr ro'yxatlari) bilan ishladi - ishonch hosil bu ishlamaydi. Yuqorida endi to'g'ri sintaksis (max66-ning suratini solishtirish), ammo ambiguit tufayli ishlamayapti ...
qo'shib qo'ydi muallif Aconcagua, manba

Mustaqil javob emas, balki max66 javobiga qo'shimcha:

sinab ko'ring bo'lishi mumkin:

template
using Alias = typename Something::Another;

Avvaliga, albatta, go'zal ko'rinadi, shunday emasmi?

Ammo, muammo faqat bir shablon parametri bilan bo'ladi:

Alias a;

Which one is it now? Something::Another<> or Something<>::Another? And if you have more parameters, how to distribute? No chance to get a meaningful solution. So no, you can't do that directly, you have to help yourself with tricks such as max66 proposed...

0
qo'shib qo'ydi
O'zi juda yaxshi biladi, bu ishlamaydi. Savolga ko'ra ...
qo'shib qo'ydi muallif Barry, manba
U yomon sintaksisi (ikki shabloni parametr ro'yxatlari) bilan ishladi - ishonch hosil bu ishlamaydi. Yuqorida endi to'g'ri sintaksis (max66-ning suratini solishtirish), ammo ambiguit tufayli ishlamayapti ...
qo'shib qo'ydi muallif Aconcagua, manba

Mustaqil javob emas, balki max66 javobiga qo'shimcha:

sinab ko'ring bo'lishi mumkin:

template
using Alias = typename Something::Another;

Avvaliga, albatta, go'zal ko'rinadi, shunday emasmi?

Ammo, muammo faqat bir shablon parametri bilan bo'ladi:

Alias a;

Which one is it now? Something::Another<> or Something<>::Another? And if you have more parameters, how to distribute? No chance to get a meaningful solution. So no, you can't do that directly, you have to help yourself with tricks such as max66 proposed...

0
qo'shib qo'ydi
O'zi juda yaxshi biladi, bu ishlamaydi. Savolga ko'ra ...
qo'shib qo'ydi muallif Barry, manba
U yomon sintaksisi (ikki shabloni parametr ro'yxatlari) bilan ishladi - ishonch hosil bu ishlamaydi. Yuqorida endi to'g'ri sintaksis (max66-ning suratini solishtirish), ammo ambiguit tufayli ishlamayapti ...
qo'shib qo'ydi muallif Aconcagua, manba