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

时间:2017-04-21 23:45:16

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

函数f接收可以使用Wrapper函数转换为transform的参数,并且必须调用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函数?

1 个答案:

答案 0 :(得分:1)

  

有没有办法实现这一点,没有暴露转换函数?

使用lambda函数怎么样?

template <typename... Args>
Wrapper f(Args&&... args)
 {
   static const auto tf = [](auto && value)
    { return Wrapper(std::forward<decltype(value)>(value)); };

   return f2( tf(std::forward<Args>(args)) ... );
 }

观察您标记了C ++ 14,以便在lambda函数中使用auto参数

另一个解决方案(也是C ++ 11)可以使用仿函数(fc代替f

class fc
 {
   private:
      template <typename T>
      Wrapper transform (T && value)
       { return Wrapper(std::forward<T>(value)); }

   public:
      template <typename... Args>
      Wrapper operator() (Args&&... args)
       { return f2( transform(std::forward<Args>(args)) ... ); }
 };

但用法略有不同:你可以创建一个临时对象(但使用另外两个括号

fc()(1, "abc", 2.3f);

或者您可以创建fc类型的对象并将其用作函数

fc f0;

f0(1, "abc", 2.3f);