2016-11-05 3 views
2

std::vectorstd::reference_wrapper입니다. printf를 사용하여 인쇄하고 싶은 대상 (cout 포함하지 않음)입니다. 지금, 나는C++ : 참조 래퍼 및 printf

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

를 작성하는 경우 I (나는 a의 주소 생각)을 nosense 번호를 얻을; 내 값을 얻기 위해 나는 printf.get() 기능에 자동 통화를 할 수있는 방법이 있나요

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

을 할 필요가 (예를 들어 다른 % 나에게 reference_wrapper content를 인쇄 specificator) 그래서 모두 작동하는 일반화 된 기능을 할 수 있습니다 std::reference_wrapper<type>type?

+0

첫 번째 단계는 stdio 라이브러리가 아닌 iostream 라이브러리를 사용하는 것입니다. – Hurkyl

+0

첫 번째 코드 스 니펫은 어디에서나 컴파일되지 않습니다. 'error : non-trivially-copyable 타입의 객체를 전달할 수 없습니다. 'class std :: reference_wrapper '~ '...'' –

+0

@Hurkyl 이미 iostream을 사용하고 있습니다. – volperossa

답변

2

당신은 아마 원하는 최소한 레거시 C 함수 대신 C++ IO 라이브러리 사용을 고려하십시오. 그는 당신이 참조 래퍼의 랩 해제 제공하기 위해 printf 주위에 래퍼를 작성할 수 말했다되는 :로 구현 unwrap

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

은 다음과 같습니다

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>>{}); 
} 

is_reference_wrapper 특성 :

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()은 C++ 클래스와 참조에 대해 전혀 알지 못하는 C 라이브러리 함수이며, 절대 알 수 없습니다.

C++은 약 C++ 클래스를 알고 스트림 객체를 사용하여 자신의 입/출력 라이브러리를 가지고, 그들을 사용하는 방법 :

#include <iostream> 

#include <memory> 

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

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

    return 0; 
} 

출력 :

5 
1

printf 암시 적 유형 변환을 수행하지 않습니다. 적어도 std :: reference_wrapper에 대해 변환 연산자를 호출하지 않아도 작동하려면 std::cout과 같은 유형 변환을 수행 할 수있는 무언가를 사용해야합니다.

#include <iostream>                

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

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