2017-12-16 48 views
8

나는 전문화 다음과 같은 템플릿 기능이 있습니다 변환 할 수있는 방법이 있나요매개 변수 팩의 각 요소에 기능을 적용

template<typename ... Args> 
void doSomething(Args ... args) { 
    // Convert parameter pack using convert function above 
    // and call any other variadic templated function with 
    // the converted args. 
} 

:

// Pass the argument through ... 
template<typename T, typename U=T> 
U convert(T&& t) { 
    return std::forward<T>(t); 
} 

// ... but convert std::strings 
const char* convert(std::string s) { 
    return s.c_str(); 
} 

을 나는 다음과 같은 가변 인자 템플릿 함수가있는 경우 코멘트에서와 같이 convert 함수를 사용하는 매개 변수 팩?

내 원래의 목표는 문자열에서 .c_str()을 수동으로 호출 할 필요없이 printf와 같은 함수에서 '% s'에 std :: string을 전달할 수 있다는 것이 었습니다. 그러나 이것이 간단한 방법으로 수행 될 수 있다면 나는 또한 일반에 관심이있다. 나의 시도는 지금까지 실패했다. something(convert(args)...)가 확장되는 parameter pack expansion입니다

+0

btw,'doSomething'은 전달 참조를 허용하지 않는 반면,'convert'는 전달 참조를 받아들입니다. 또한'convert (std :: string)'는 매달려있는 포인터를 반환합니다. 그래서 몇 가지 변경을 원할 수 있습니다. – StoryTeller

+0

@StoryTeller 만약 내가 그것을 인쇄하고 싶다고 제안했다면 나는 포인터를 가지고 있어도 괜찮을 것이라고 생각한다. – Zitrax

+0

's'가 변환 할 로컬입니다. 어떻게 괜찮을까요? – StoryTeller

답변

10
template<typename ... Args> 
void doSomething(Args ... args) { 
    something(convert(args)...); 
} 

: BTW

// pseudocode 
something(convert(arg0), convert(arg1), convert(arg2), ...) 

, 당신은 불필요한 복사를 방지하기 위해 전달 참조에 의해 args을하고 제대로 을 전파 할 수 있습니다 왼쪽 값 참조 :

template<typename... Args> 
void doSomething(Args&& ... args) { 
    something(convert(std::forward<Args>(args))...); 
}