c++ - 如何将可变参数模板参数转换为另一种类型以调用另一个函数?

标签 c++ c++14 variadic-templates

函数 f 接收可以使用 transform 函数转换为 Wrapper 的参数,它必须调用 f2f2 接收可变数量的 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/

相关文章:

c++ - 非法使用已删除的函数

c++ - 是否保证 `std::list::splice(std::const_iterator pos, std::list&& other)`保留 `other`为空?

c++ - 递归可变参数模板函数 - 没有歧义?

c++ - 如何在 Cocos2d 中显示倒数计时器?

c++ - 使用相同的 udp 套接字进行异步接收/发送

对象数组的 C++ 文件输出

c++ - 如何默认构造迭代器的value_type作为函数中的默认参数?

c++ - 如何使用可变参数模板在 C++ 中获取参数的变量号及其大小

c++ - 可变参数模板参数的传递位置

c++ - std::move 在 boost 库中的对应物