使用模板来生成const和非const相同的方法?

时间:2018-07-17 21:52:19

标签: c++

是否可以定义interface,例如:

class IFoo
{
  virtual void foo(const X &x) const = 0;
  virtual void foo(X &x) = 0;
};

并在子类foo中用模板定义两个C方法,该模板可以实例化两次,一次用于类型实参<const X>,一次用于<X>?例如:

class C : public IFoo
{
  template<typename T>
  void foo(T &t) {...}
};

// instantiate void C::foo(X &x)
//         and void C::foo(const X &x) const ???

2 个答案:

答案 0 :(得分:2)

模板函数不能是虚拟的,因此即使您能够根据template参数应用常量性,也不会覆盖虚拟函数。例如,以下代码无法在带有以下内容的g ++(4.8.5)上编译:{{1​​}}

error: templates may not be ‘virtual’

答案 1 :(得分:-1)

据我所知,这是不可能的。 C ++允许使用附加的编译时bool条件指定noexcept,但是对于const而言,这是不正确的。可以选择指定

template<typename T>
void foo(T &t) const(std::is_const_v<T>)
{
}

会很好。