2017-04-21 108 views
1

函数f接收使用transform函数可以转换为Wrapper的参数,它必须调用f2f2收到一个varidic数量的包装类似的参数。如何将可变参数模板参数转换为另一种类型以调用另一个函数?

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函数?

+2

你有没有试过返回f2(transform(std :: forward (args))...)? – linuxfever

+1

@ chema989 - 对不起,但我不知道...从linuxfever的建议看起来我是正确的:用'f2(变换(std :: forward (args))...)','f2()'被称为用一系列'wrapper's并且完全匹配你的'f2()'签名。 – max66

+0

@ max66我会检查你的答案。 – chema989

回答

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,从而可以使用auto参数在lambda函数

另一种解决方案(也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); 
+0

Thanks @ max66。我正在使用'C++ 14'。 lambda函数是一个不错的选择。 – chema989

+0

抱歉:downvoter可以解释downwote吗? – max66

2

包膨胀可应用于任意复杂的表达式。在这里:

return f2(/* For each arg in args -> transform(std::forward<Args>(args)...)*/); // Problem! 

的问题是,你正在扩大transform里面......这是写f2(transform(a0, a1, a2, ..., aN))的等价物。希望这很明显,为什么这是错的。你想要扩展到的表达式包括transform。即:

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

其中扩展为f2(transform(a0), transform(a1), ..., transform(aN))

+0

是的,这是我的错误,包扩展必须包含'transform'。谢谢@巴里 – chema989

相关问题