2013-05-09 8 views
12

std::vector może być inicjowany jakoJak zaimplementować listę inicjalizacyjną dla typu zdefiniowanego przez użytkownika? (Analogiczne do std :: vector listy inicjalizator)

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

Reference

Teraz, jeśli chcemy osiągnąć podobną funkcjonalność dla jednego z moich typów, w jaki sposób go o to robi ? Jak powinienem wdrożyć konstruktora dla tej funkcjonalności ?.

W jaki sposób standard wspomaga mnie w osiągnięciu tego celu (odniesienie do normy będzie najbardziej pomocne) ?. Zasadniczo, jeśli mógłbyś mnie nauczyć, jak to jest zaimplementowane dla std::vector, to będzie wystarczające.

Czy można to zrobić również przed C++ 11?

Co więcej, czy mogę mieć listę inicjalizatorów typu POD struct, dzięki czemu mogę mieć wartości z różnymi typami, aby zainicjować mój typ?

Odpowiedz

24

Tworzenie konstruktora która przyjmuje std::initializer_list jako parametr:

#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 robi to niemal dokładnie w ten sam sposób (chociaż wykorzystują begin() i end() - std::initializer_list ma iteratory taki sam sposób jak inne pojemniki zrobić) . Od 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()); 
    } 

EDIT: Nie jestem 100%, co próbujesz zrobić, ale może po prostu być w stanie wykorzystać jednolitej inicjalizacji aby uzyskać to, co chcesz:

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"}; 
} 
+0

wartości na liście inicjalizującej muszą być tego samego typu, prawda? czy mogę mieć inny typ (tak jak inicjowanie struktury POD)? –

+0

@Koushik Muszą być wszyscy jednego rodzaju. Jest skutecznie przechowywany jako tablica typu 'T'. – Yuushi

+0

oh tak ma mieć strukturę POD takich jak lista inicjalizacyjna jest to? –

Powiązane problemy