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