C++ 模板参数包可以';t推断'const&;`论点

C++ 模板参数包可以';t推断'const&;`论点,c++,c++14,variadic-templates,C++,C++14,Variadic Templates,所以我有一门课: struct C { int x[10]; int const& get(int i) const { return x[i]; } template<typename... Ts> auto& get(Ts... args) { int const& (C::*f)(Ts...) const = &C::get; return const_cast<int&>((this-&g

所以我有一门课:

struct C {
  int x[10];

  int const& get(int i) const { return x[i]; }

  template<typename... Ts>
  auto& get(Ts... args) {
    int const& (C::*f)(Ts...) const = &C::get;
    return const_cast<int&>((this->*f)(args...));
  }
};
但是如果我将原始getter的参数类型更改为引用:

  int const& get(int const& i) const { return x[i]; }
const
getter模板无法再与
const
getter匹配

显然,通过值传递
int
没有什么大不了的,将参数列表显式地传递给模板也没有什么大不了的,但是我有更复杂的参数和大量的重载,我想用最少的复制粘贴来推断我所有的非
const
getter

有什么办法可以克服这一点吗


我的一个想法是,我可以在类中声明问题参数列表,但将定义留给模板,这样参数匹配就会有一些指导。我尝试将以下内容添加到类中(在模板之前或之后):


不幸的是,这完全绕过了模板,导致了链接错误。向声明中添加
inline
template
似乎也没有效果。

为什么要通过指向成员函数的辅助指针强制调用
const
成员函数?在这种情况下,我使用
const
限定
this

template<typename... Ts>
auto& get(Ts... args) {
    const C* const const_this = this;
    return const_cast<int&>(const_this->get(args...));
}
模板
自动获取(Ts…args){
常数C*常数const_this=此;
返回const_cast(const_this->get(args…);
}

通过“无数重载”,事实证明我实际上有两个重载,但这是我关心的原则。我以后可能会得到更多。我认为您的编译器也应该抱怨
int&I=c.get(I)
,因为
int&
不是常量。@Anders K.,这就是模板存在的原因。它通过调用const getter并从结果中剥离const来创建一个非const getter。这对于使用来自各种常量和非常量方法的同一getter非常有用。如果存在多个重载,那么它会选择具有匹配参数列表的重载来调用。不幸的是,如果const getter接受引用参数,“匹配”将失败,因为该调用看起来像是按值调用。@AndersK.,为清晰起见进行了编辑。为什么需要中间变量
f
?为什么不直接调用
get
?哦,糟糕!因为它是从另一个模板演变而来的,我试图在返回类型上获得隐式匹配;但我不太清楚为什么。另一个版本仍然受到影响,该版本采用函数指针参数,以便将大多数详细信息应用于各种getter。
  int& get(int const& i);
template<typename... Ts>
auto& get(Ts... args) {
    const C* const const_this = this;
    return const_cast<int&>(const_this->get(args...));
}