C ++ shared_ptrs векторында бірнеше түрлерді қалай сақтауға болады?

Std :: vector-да бірнеше shared_ptr-ді әрқайсысына көрсеткішпен басқа түрге қалай сақтауға болады?

std::vector < ? > vec;
vec.push_back( make_shared(3));
vec.push_back( make_shared(3.14f));

Компиляторға арналған материалдарды пайдаланбастан, осы тапсырма үшін пайдаланатын негізгі полиморфтық класс бар ма?

5
вектордың түрлері туралы білудің қажеті жоқ, бұл «ресурстарды» орналастырудың орны ғана. Ресурстарды тірі сақтау үшін кем дегенде 1 shared_ptr керек, ал вектор осы себепті осында. Ресурстардың бірнеше түрі бар болғандықтан, мен мәселені шешудің сәтті шешілуіне байланысты бірнеше әртүрлі shared_ptr пайдалану керек.
қосылды автор GameDeveloper, көзі
Жоқ, мен Tuple-ты пайдалана аламын, бірақ бірнеше үлгі шаблондарды тапсыруым үшін, айнымалы үлгі жұмыс істемейді, бірақ std :: vector әлі де тек 1 түрін қабылдайды.
қосылды автор GameDeveloper, көзі
Неліктен сізге қажет екенін түсіндіріп бере аласыз ба?
қосылды автор dchhetri, көзі
Сақталған сыныптың түрін осылай қалай алуға болады? Ортақ базалық класссыз (бұл әрекетті көргеніме байланысты), сіз сүзгілерді және инценттерді бірге араластырсаңыз, не сақталатындығын айта алмайсыз. Не істеуге тырысатыныңыздың кейбіреулері бұл ортақ көрсеткіштер ретінде көруге көмектеседі, сондай-ақ, басымды біраз сызып тастайды.
қосылды автор Michael Dorgan, көзі
@DarioOO: Бұл өзі үшін std :: vector дегеннің өзі емес. Ол T контейнеріне арналған. Сондықтан, сіз std :: vector үшін балама іздеңіз немесе мәселені T толықтай азайтуыңыз керек.
қосылды автор Sebastian Mach, көзі
Вариативті үлгі бұл мәселені қалай шешеді?
қосылды автор bstamour, көзі
Кейбір әртүрліліктерге қарай, біртұтас емес шешімдер Variadic үлгілерін пайдаланатын болады, en.wikipedia.org/wiki/Variadic_template , C ++ 11-нің ерекшелігі болатын
қосылды автор Muckle_ewe, көзі

6 жауаптар

Мұны істеудің бірнеше жолы бар. Int және float пайдаланғандықтан, әртүрлі түпнұсқа түрлерін сақтауды қалайды деп ойлаймын.

  1. If your list of types is finite, use boost::variant. e.g.

    std::vector>>;
    
  2. If you want to store anything, use boost::any. e.g.

    std::vector>;
    
6
қосылды
Мақала дәлелдер тізімінің басында бос орын қалдырғаныңыздың нақты себебі бар ма, бірақ соңында емес?
қосылды автор Konrad Rudolph, көзі
Ах. :) Мәні бар. Мен код блоктарын түзетіп жібердім, бірақ мен оны қатал деп тапсам да, сіздің идиоматикалық код стилімен араласқым келмейді. ;-) Біз келісетінімізді қуана естисіз.
қосылды автор Konrad Rudolph, көзі
Мен посттарды пішімдеуде жаңалық болғандықтан. :-p Олар бастапқыда код блоктары ретінде көрсетілмеді және редакторды ішкі түрлерді шығармау үшін алудың жалғыз жолы - бос орын қалдыру.
қосылды автор bstamour, көзі

Ресурстарды тірі сақтау үшін кем дегенде 1 shared_ptr керек.

Бұл жұмыс істеу үшін сіз сақтаған барлық түрлері ортақ көрсеткіште қамтылған түрге ұқсас бірдей негізгі сыныптан мұраға алады. Сонымен қатар, базалық сыныбы виртуалды деструкторды жариялауы керек ( бұл сұрақты ).

Using boost::any will mean that every other shared_ptr to the objects also has to be a shared_ptr, which is likely not what you want.

0
қосылды

Міне, келесі шешімді шешу арқылы шешуге болатындығым мүмкін

class ISomething{
    bool isAlive;
public:
    virtual bool alive(){ return isAlive;}
    virtual ~ISomething() {}
};

template 
class Something: public ISomething{
    std::shared_ptr myRes;
public:    
};

std::vector myVec; //push back a new dynamic allocation for each "Something"

Бұл негізінен өшіру түрін көрсетеді, « Boost :: Кез-келген «» Poco :: Кез келген «» Ogre :: Кез-келген «

0
қосылды
Diggin үшін рахмет, иә, негізінен «түрді өшіру» керек болды, бірақ бұл дұрыс жолмен жасалды. Осы жауабын ұмытып, қазір түзетемін
қосылды автор GameDeveloper, көзі
Бұл нысанды кесу деп аталатын тұжырымдамаға байланысты жұмыс істемейді. ONLY векторы нысандардың ISomething бөлігін сақтайды. Бір нәрсені сақтауға тырысып, нәрсені тек векторға көшірілетін ISomething бөлімі ғана әкеледі. Дерек көзі болған кезде бір нәрсе шегінен шығып кетеді, shared_ptr <> сілтеме санағын босатады. Егер сіз орнына бір нәрсені бөліп қойсаңыз және std :: vector сақталған болса, ол жұмыс істейтін еді, бірақ бұл сіз қалаған нәрсе емес.
қосылды автор Mark, көзі

Жоқ, C ++-де бір де бір түрі жоқ, оның бәрі басқа көптеген тілдер сияқты шығарылады. int және float - бұл туынды түрлері , яғни олар тілдің іргелі және басқа ештеңеден туындамайды.

Егер Boost артықшылығы болса, оның орнына vector түрінде кез келген немесе нұсқасы түрлерін сақтауға болады.

0
қосылды

Сізге шынымен де мұны істеу керек, кез келген .

And use std::vector > vec;

0
қосылды

You can't mix types like that. You may want to have a look at boost::any

0
қосылды