Vraag Hoe een initialiseerlijst voor een door de gebruiker gedefinieerd type te implementeren? (analoog naar std: vector initializer lijst)


std::vector kan worden geïnitialiseerd als

std::vector<std::string> words1 {"the", "frogurt", "is", "also", "cursed"}; 

Referentie

Als ik nu dezelfde functionaliteit voor een van mijn typen wil bereiken, hoe kan ik dit dan doen? Hoe moet ik de constructor voor deze functionaliteit implementeren ?.

Hoe ondersteunt de standaard mij om dit te bereiken (verwijzing naar standaard zal zeer nuttig zijn) ?. Kort gezegd, als je me zou kunnen leren hoe het is geïmplementeerd std::vector het zal voldoende zijn.

Kan dit ook vóór C ++ 11 worden gedaan?

Kan ik ook een POD struct type initializer lijst hebben zodat ik waarden met verschillende types kan hebben om mijn type te initialiseren?


13
2018-05-09 05:31


oorsprong


antwoorden:


Maak een constructor die een std::initializer_list als een parameter:

#include <vector>
#include <initializer_list>

template <typename T>
struct foo
{
private:
    std::vector<T> vec;

public:

    foo(std::initializer_list<T> init) 
      : vec(init)
    { }
};


int main()
{
    foo<int> f {1, 2, 3, 4, 5};
}

std::vector is dit bijna precies op dezelfde manier (hoewel gebruik begin() en end() - std::initializer_list heeft iterators op dezelfde manier als andere containers doen). Van gcc:

  vector(initializer_list<value_type> __l,
     const allocator_type& __a = allocator_type())
  : _Base(__a)
  {
_M_range_initialize(__l.begin(), __l.end(),
            random_access_iterator_tag());
  }

Bewerken: ik ben niet 100% wat je probeert te doen, maar je kunt het gewoon gebruiken uniforme initialisatie om te krijgen wat je wilt:

struct bar
{
private:

    int i;
    double j;
    std::string k;

public:

    bar(int i_, double j_, const std::string& k_)
      : i(i_), j(j_), k(k_)
    { }

};

int main()
{
    bar b {1, 2.0, "hi"};
}

24
2018-05-09 05:37