template<typename...Ts>
struct Wrapper{
using result_type = void (*)(Ts...);
template<typename T, T (*P)(Ts...)>
static result_type wrap(){
return [](Ts...ts) {
P(forward<Ts>(ts)...); // The forward is required, or the code below will fail.
};
};
};
int fun(int&& i, int& j, int k) {
return 0;
}
auto wrapped = Wrapper<int&&, int&, int>::wrap<int, fun>();
int i = 2;
wrapped(1, i, 3);
它有效,问题是,当传递一个无引用类型时,forward会将它转换为rvalue,这意味着在上面的代码中将移动第三个参数。那么如何在没有T&amp;&amp;?
的情况下转发确切的类型答案 0 :(得分:1)
您可以在此处使用static_cast
代替forward
,因为您的目标是转换为Ts...
中指定的确切类型:
// ...
P(static_cast<Ts>(ts)...);
// ...