2017-12-16 178 views
8

Ben uzmanlaşma ile aşağıdaki şablon işlevi vardır: dönüştürmek için herhangi bir yolu var mıparametre paketinde her öğe üzerinde işlevini uygulayın

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

Sonra gibi variadic şablon işlevi varsa parametre paketi, yorumdaki gibi dönüştürme işlevini kullanıyor mu?

Özgün amacım std :: string öğesini, dizgelerde ilk olarak .c_str() öğesini çağırmak zorunda kalmadan, printf gibi bir işlevde '% s' değerine geçebilmekti. Ama eğer bu basit bir şekilde yapılabiliyorsa genel olarak da ilgileniyorum, denemem başarısız oldu. something(convert(args)...) şeklinde genişleyen parameter pack expansion olduğunu

+0

btw, 'doSomething', yönlendirme referanslarını kabul etmiyor; Ayrıca 'convert (std :: string)', sarkan bir işaretçi döndürür. Yani bazı değişiklikler yapmak isteyebilirsiniz. – StoryTeller

+0

@StoryTeller Sadece önermek istediğim kadarıyla yazdırmak istediğimden bu yana işaretçiyi iyi bulmayı düşünüyorum. – Zitrax

+0

's' dönüştürmek için yereldir. Nasıl iyi olabilir? – StoryTeller

cevap

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

: BTW

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

, gereksiz kopyalarını önlemek amacıyla yönlendirme referanslar tarafından args almak ve düzgün yaymak isteyebilirsiniz lvalue referansları:

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