模板化子类的父类 () 运算符的自动返回值

问题描述 投票:0回答:1

我想知道是否可以在非模板化父类中拥有一个具有

auto
返回值和模板化子类的运算符??

这是一个例子:

#include <vector>
#include <iostream>
class parent{
public:
  virtual ~parent(){};
  auto & operator()(const int i);
};
template<typename T>
class child:public parent{
protected:
  std::vector<T> X_;
public:
  child(std::vector<T> const &X):X_{X}{};
  T & operator()(const int i){
    return(X_[i]);
  }
};
auto & parent::operator()(const int i){
  if(auto * x=dynamic_cast<child<int>*>(this)){
    return((*x)(i));
  }else if(auto * x=dynamic_cast<child<double>*>(this)){
    return((*x)(i));
  }else{
    throw std::string("error");
  }
};
int main(){
  child Y1(std::vector<int>{5,10});
  child Y2(std::vector<double>{6,11});
  std::cout<<Y1(0)<<std::endl;
  parent * X=&Y1;
  std::cout<<(*X)(0)<<std::endl;
}

目前我得到:

error: 'auto' in return type deduced as 'double' here but deduced as 'int' in earlier return statement

任何建议,非常感谢。

c++ templates operator-overloading c++20 parent-child
1个回答
0
投票

这个概念行不通。

parent::operator()
的返回类型必须在编译时确定。
auto
无法施展魔法,它只是让我们依靠编译器来推导出实际类型。

在您的实现中,

parent::operator()
的返回类型可以是
int&
double&
,具体取决于在运行时确定的派生类的类型(
dynamic_cast
是运行时功能)。所以编译器会发出错误。

另一种看待它的方式: 在此声明中:

std::cout<<(*X)(0)<<std::endl;

表达式

(*X)(0)
的类型必须在编译时确定,以便为
operator<<
选择适当的
ostream
重载。但它不能,因为它可以是多种类型之一,具体取决于
dynamic_cast

© www.soinside.com 2019 - 2024. All rights reserved.