2016-11-05 3 views
2

Ich habe eine std::vector von std::reference_wrapper Objekte, die ich mit printf (ohne Cout) drucken möchte; jetzt, wenn ichC++: Referenzwrapper und printf

int a=5; 
std::reference_wrapper<int> b=a; 
printf("%i\n\n",b); 

schreiben bekomme ich eine nosense Nummer (ich glaube, die Adresse a ist); meinen Wert zu erhalten Ich habe

printf("%i\n\n",b.get()); 

Gibt es eine Möglichkeit der automatischen Aufruf von .get() Funktion hat in printf (zB einen anderen % specificator, die mir die reference_wrapper content drucken) zu tun, so kann ich eine verallgemeinerte Funktion machen, die beide Werke mit std::reference_wrapper<type> und type?

+0

Der erste Schritt wäre die Verwendung der Iostream-Bibliothek anstelle der stdio-Bibliothek. – Hurkyl

+0

Ihr erstes Code-Snippet wird nicht überall kompiliert. 'Fehler: kann nicht Objekte von nicht-trivial-kopierbaren Typ 'Klasse übergeben std :: reference_wrapper ' durch '...'' –

+0

@Hurkyl Ich benutze bereits Iostream – volperossa

Antwort

2

Sie wollen wahrscheinlich zu Denken Sie zumindest daran, eine C++ - IO-Bibliothek anstelle von älteren C-Funktionen zu verwenden. Davon abgesehen, Sie einen Wrapper um printf schreiben können Abwickeln von Referenz Wrapper zur Verfügung zu stellen:

template<typename... Params> 
void my_printf(char const* fmt, Params&&... ps) 
{ 
    printf(fmt, unwrap(std::forward<Params>(ps))...); 
} 

mit unwrap wie folgt umgesetzt:

template<typename T> 
decltype(auto) unwrap_impl(T&& t, std::false_type){ 
    return std::forward<T>(t); 
} 

template<typename T> 
decltype(auto) unwrap_impl(T&& t, std::true_type){ 
    return t.get(); 
} 

template<typename T> 
decltype(auto) unwrap(T&& t) 
{ 
    return unwrap_impl(std::forward<T>(t), is_reference_wrapper<std::decay_t<T>>{}); 
} 

und das is_reference_wrapper Merkmal:

template<typename T> 
struct is_reference_wrapper : std::false_type {}; 

template<typename T> 
struct is_reference_wrapper<std::reference_wrapper<T>> : std::true_type{}; 

demo

1

printf() ist eine C-Bibliothek-Funktion, die absolut nichts über C++ - Klassen und Referenzen weiß und nie etwas über sie wissen wird.

C++ verfügt über eine eigene Eingabe/Ausgabe-Bibliothek, die Stream-Objekte verwendet, die etwa C++ Klassen kennt, und wie sie benutzen:

#include <iostream> 

#include <memory> 

int main() 
{ 
    int a=5; 
    std::reference_wrapper<int> b=a; 

    std::cout << b << std::endl; 

    return 0; 
} 

Ausgang:

5 
1

printf macht keine implizite Typkonvertierung, zumindest nicht Aufruf der Konvertierungsoperator in diesem Fall für Ihre std :: reference_wrapper, damit es funktioniert, müssen Sie etwas verwenden, das Typ Konvertierung kann, wie std::cout.

#include <iostream>                

int a=5;                   
std::reference_wrapper<int> b=a;             

int main() {                               
    std::cout<<b<<std::endl;              
}