2016-04-16 8 views
0

einen Zeiger deklarieren wie alsC++ 11/14/17 funktioniert Unterstützung "auto neue"

CAMArrayRefHash<AMPSDK::H264Video::SEQ_PARAMETER_SET_RBSP>* h264_sps; 

Wenn eine Instanz für sie machen schließlich:

h264_sps = new CAMArrayRefHash<AMPSDK::H264Video::SEQ_PARAMETER_SET_RBSP>(); 

Gibt es eine einfache Möglichkeit für es in C++ 11/14/17? zum Beispiel Auto neue

h264_sps = auto new; 
+0

die Antwort aktualisiert jetzt ich realisiere, was Sie wollen –

+0

Vielleicht typedef das in etwas besser managable. Wäre auch klarer, da Sie immer noch in der Lage wären, zu sehen, was zugewiesen wird, anstelle eines obskuren automatischen Updates, das nichts sagt, wenn es funktionieren würde. – Unimportant

+1

Tauschen Sie das 'Auto' und den Typ! 'auto * h264_sps = neu CAMArrayRefHash <…>();' –

Antwort

6
#include <utility> 
#include <iterator> 

int main() 
{ 
    int* p; 

    p = new std::decay_t<decltype(*p)>; 
    p = new std::iterator_traits<decltype(p)>::value_type(); 
} 

oder wir können mit Template-Argument Abzug kreativ:

#include <utility> 
#include <iterator> 

template<class Ptr, class...Args> 
Ptr make_new(Ptr& p, Args&&...args) 
{ 
    p = new std::decay_t<decltype(*p)>(std::forward<Args>(args)...); 
    return p; 
} 

int main() 
{ 
    int* p; 

    // warning: initialises p 
    make_new(p); 

    // initalise p and return a copy to ease use in algorithms 
    auto pcopy = make_new(p); 
} 
+1

Das war nicht die Frage obwohl; Sie fragten, ob es eine Möglichkeit gebe, den neuen Typ zu ersetzen. Vermutlich wussten sie schon von Auto, sonst hätten sie nicht gefragt. – Cubic

+0

@cubic erkannte, dass während Sie downvoting. aktualisiert. –

+0

'iterator_traits' scheint eine sehr verwirrende Möglichkeit zu sein, einen Typ zu bekommen, der nichts mit Iteratoren zu tun hat. – juanchopanza

2

Wenn Sie auf C++ 11/14/17 nur verwenden smart_pointers mit Stichwort kombiniert using:

using RBSP = AMPSDK::H264Video::SEQ_PARAMETER_SET_RBSP; 

//if it's shared resource use **shared_ptr** 
std::shared_ptr<RBSP> h264_sps{}; 
//if it's owned only by a class/struct, 
std::unique_ptr<RBSP> h264_sps_unique{}; 
//after some lines of code or in another file... 
h_264_sps = std::make_shared<RBSP>(); 
//Only in C++14/17: 
h264_sps_unique = std::make_unique<RBSP>(); 

Mit dieser Lösung vermeiden Sie nackte Zeiger (die eine bad practice mit modernen C++ betrachtet werden) und Sie müssen weniger in jedem Auftreten Ihres Zeigers eingeben.