对参数包中的每个元素应用函数

Apply function on each element in parameter pack

本文关键字:元素 应用 函数 参数 包中      更新时间:2023-10-16

我有以下具有专用化的模板函数:

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

如果我有一个可变参数模板函数,例如:

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

有没有办法使用注释中的转换函数转换参数包?

我最初的目标是能够在类似 printf 的函数中将 std::string 传递给 '%s',而不必先在字符串上手动调用 .c_str()。但我也对一般感兴趣,如果这可以用简单的方式完成,到目前为止我的尝试失败了。

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

其中something(convert(args)...)是扩展到以下内容的参数包扩展:

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

顺便说一句,您可能希望通过转发引用args以避免不必要的副本并正确传播左值引用

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