我想知道是否可以在非模板化父类中拥有一个具有
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
任何建议,非常感谢。
这个概念行不通。
parent::operator()
的返回类型必须在编译时确定。 auto
无法施展魔法,它只是让我们依靠编译器来推导出实际类型。
在您的实现中,
parent::operator()
的返回类型可以是int&
或double&
,具体取决于在运行时确定的派生类的类型(dynamic_cast
是运行时功能)。所以编译器会发出错误。
另一种看待它的方式: 在此声明中:
std::cout<<(*X)(0)<<std::endl;
表达式
(*X)(0)
的类型必须在编译时确定,以便为operator<<
选择适当的ostream
重载。但它不能,因为它可以是多种类型之一,具体取决于 dynamic_cast
。