2013-08-13 11 views
7

Na przykład chciałem mieć zmienną typu auto, ponieważ nie jestem pewien, jaki to będzie typ.Czy można mieć zmienną składową "auto"?

Kiedy próbuję zadeklarować w klasie deklaracji/struct to daje mi ten błąd:

Cannot deduce auto type. Initializer required

Czy istnieje sposób wokół niego?

struct Timer { 

    auto start; 

}; 
+1

swoją figurę typu –

+4

Czy nie to szablony są za? – user1520427

+0

Kiedy dowiesz się, jaki to będzie typ? Skompilować czas lub czas pracy? Czy możesz podać nam jakiś kontekst? Co próbujesz zrobić? – Homer6

Odpowiedz

20

Można, ale trzeba zadeklarować static i const:

struct Timer { 
    static const auto start = 0; 
}; 

A working example in Coliru.

Z tym ograniczeniem nie można zatem przyjąć elementu start jako elementu niestatycznego i nie można mieć różnych wartości w różnych obiektach.

Jeśli chcesz różnych rodzajów start dla różnych obiektów, lepiej mieć swoją klasę jako szablon

template<typename T> 
struct Timer { 
    T start; 
}; 

Jeśli chcesz wydedukować rodzaj T można utworzyć funkcję fabrycznie tak robi to odliczenie typu.

template<typename T> 
Timer<typename std::decay<T>::type> MakeTimer(T&& startVal) { // Forwards the parameter 
    return Timer<typename std::decay<T>::type>{std::forward<T>(startVal)}; 
} 

Live example.

3

To właśnie C++ draft standard ma do powiedzenia na temat korzystania auto dla zmiennych składowych, w sekcji 7.1.6.4 auto specifier pkt 4:

The auto type-specifier can also be used in declaring a variable in the condition of a selection statement (6.4) or an iteration statement (6.5), in the type-specifier-seq in the new-type-id or type-id of a new-expression (5.3.4), in a for-range-declaration, and in declaring a static data member with a brace-or-equal-initializer that appears within the member-specification of a class definition (9.4.2).

ponieważ musi być zainicjowany oznacza to również, że musi być const. Więc coś jak poniżej będzie działać:

struct Timer 
{ 
    const static int start = 1; 
}; 

Nie sądzę, że dostaje zbyt dużo chociaż, używając szablonu jako Mark sugeruje, że albo teraz myślę o niej trochę więcej może po prostu potrzebują Variant Type w tym przypadku powinieneś sprawdzić Boost.Variant lub Boost.Any.

1

Nie. Każdy konstruktor może mieć własny inicjator dla start, więc nie może istnieć spójny typ do użycia.

Jeśli zrobić posiada użyteczną wyrażenie, które można użyć:

struct Timer { 

    Foo getAFoo(); 

    delctype(Timer().getAFoo().Bar()) start; 

    Timer() : start(getAFoo().Bar()) { /***/ } 
};