函数 f
接收可以使用 transform
函数转换为 Wrapper
的参数,它必须调用 f2
。 f2
接收可变数量的 Wrapper 类参数。
template <typename T>
Wrapper transform(T&& value) {
return Wrapper(std::forward<T>(value));
}
template <typename... Args>
Wrapper f2(Args&&... args) {
// All arguments must be Wrappers
// More code
}
template <typename... Args>
Wrapper f(Args&&... args) {
// Arguments can be transform to Wrapper using a transform function.
return f2( /* For each arg in args -> transform(std::forward<Args>(args)...)*/ ); // Problem!
}
通常是先转换参数,然后直接调用f2
,但我不想将transform
函数公开。
有没有办法在不公开transform
函数的情况下实现这一点?
最佳答案
包扩展可以应用于任意复杂的表达式。在这里:
return f2( /* For each arg in args -> transform(std::forward<Args>(args)...)*/ ); // Problem!
问题是你在 transform
的内部展开...这相当于编写 f2(transform(a0, a1, a2, . .., aN))
。希望很清楚为什么这是错误的。您希望要扩展的表达式包含 转换
。即:
return f2(transform(std::forward<Args>(args))...);
扩展为 f2(transform(a0), transform(a1), ..., transform(aN))
。
关于c++ - 如何将可变参数模板参数转换为另一种类型以调用另一个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43553585/