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

时间:2017-12-16 18:46:22

标签: c++ templates metaprogramming variadic-templates

我有以下具有专业化的模板功能:

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

是否有任何方法可以使用转换功能转换参数包,如注释?

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

1 个答案:

答案 0 :(得分:14)

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

something(convert(args)...)parameter pack expansion,其扩展为:

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

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

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