2017-12-16 113 views
8

tôi có chức năng mẫu sau đây với chuyên môn:Áp dụng chức năng trên mỗi phần tử trong gói tham số

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

Nếu tôi sau đó có một mẫu chức năng variadic như:

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. 
} 

Có cách nào để chuyển đổi gói tham số sử dụng hàm chuyển đổi như trong chú thích?

Mục tiêu ban đầu của tôi là có thể chuyển std :: string thành '% s' trong một chức năng giống như printf mà không cần phải gọi thủ công .c_str() trên các chuỗi đầu tiên. Nhưng tôi cũng thích nói chung nếu điều này có thể được thực hiện một cách đơn giản, cố gắng của tôi cho đến nay đã thất bại.

+0

btw, 'doSomething' của bạn không chấp nhận tham chiếu chuyển tiếp, trong khi' chuyển đổi 'ngụ ý nó nên. Ngoài ra 'chuyển đổi (std :: string)' trả về một con trỏ lơ lửng. Vì vậy, bạn có thể muốn thực hiện một số thay đổi. – StoryTeller

+0

@StoryTeller nếu tôi đề nghị chỉ muốn in nó, tôi giả sử nó là ok với con trỏ vì tôi không có kế hoạch để giữ nó xung quanh? – Zitrax

+0

's' là địa phương để chuyển đổi. Làm thế nào nó có thể được ok? – StoryTeller

Trả lời

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

đâu something(convert(args)...) là một parameter pack expansion mà mở rộng để:

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

BTW, bạn có thể muốn đi args bởi tài liệu tham khảo chuyển tiếp để tránh bản sao không cần thiết và để tuyên truyền đúng Tham chiếu lvalue:

template<typename... Args> 
void doSomething(Args&& ... args) { 
    something(convert(std::forward<Args>(args))...); 
} 
Các vấn đề liên quan