如何获取模板参数包以推断按引用传递而不是按值传递?

时间:2016-12-15 09:03:31

标签: c++ c++14 pass-by-reference variadic-templates

在下面的类中, HtmlAgilityPack.HtmlDocument doc = client.DownloadString(URL); 获取指向任意wrapper方法的指针,并返回调用该方法并删除const的结果。这可用于生成相应的非const方法...

const

几乎。

问题是最终方法struct C { int x[10]; int const& get(int i) const { return x[i]; } int const& getr(int const& i) const { return x[i]; } template<typename T, typename... Ts> auto& wrapper(T const& (C::*f)(Ts...) const, Ts... args) { return const_cast<T&>((this->*f)(args...)); } int& get(int i) { return wrapper(&C::get, i); } int& getr(int const& i) { return wrapper(&C::getr, i); } }; 无法编译,因为传递给getr()的参数列表并不意味着传递引用。当我们进入wrapper()时,编译器正在寻找wrapper()的按值传递版本。

这有诀窍吗?

1 个答案:

答案 0 :(得分:6)

你可以perfect forward函数的参数:

template<typename T, typename... Ts, typename... Args>
auto& wrapper(T const& (C::*f)(Ts...) const, Args&&... args) {
  return const_cast<T&>((this->*f)(std::forward<Args>(args)...));
}

这是通过使args转发参考参数包来实现的。请注意,我们需要引入一个新的Args模板参数包,以便正确推断出参数。