【发布时间】:2020-10-13 06:29:55
【问题描述】:
我正在处理一个问题,该问题需要我根据我提供的函数参数值返回不同的返回类型。
我想做这样的事情--
在下面的代码中,doSomething() 是一个已经存在的函数(被很多客户端使用),它以mode 作为函数参数,并且已经返回了std::list<ReturnType>。
基于模式值,我必须创建另一个返回shared_future<std::list<ReturnType>> 的子功能。
如何更改此代码,以便它可以根据模式值返回两种返回类型之一?
注意:ReturnType 是一个 template typename,我们将用于整个班级。
代码:
std::shared_future<std::list<ReturnType> > futureValue() {
return functionReturningSharedFuture();
}
std::list<ReturnType> listValue() {
return functionReturningList();
}
std::list<ReturnType> doSomething(int mode) {
if(mode == 1){
// new functionality that I added
return futureValue(); // This (obviously) errors out as of now
}
else{
// already there previously
return listValue();
}
}
int main() {
doSomething(1);
return 0;
}
如何更改此代码,以便它可以根据模式值返回两种返回类型之一?
限制和问题:
- 如果我们提供一个额外的函数参数(如
true值),这个问题可以通过函数重载轻松解决,但是这个额外的参数没有用,因为我们已经在使用mode。此外,添加几乎没有用的变量也不是一个好的设计。 - 主要限制之一是已经在使用此
doSomething()的客户期望std::list<ReturnType>,因此我无法返回boost::any或std::variant或类似的东西。 - 我尝试使用
std::enable_if,但由于我们在运行时获取模式值,因此没有成功。 - 我们不能使用模板元编程,因为这会改变我们在客户端调用函数的方式。我们负担不起的事情。
谢谢。
【问题讨论】:
-
类型在编译时固定,而变量的值在运行时设置。没有多态类型是不可能的。您需要解决的实际和潜在问题是什么?为什么您认为这是最好的(或唯一的)解决方案?
-
不如简单地创建一个全新的函数,命名为
doSomethingEx,并将新的行为记录给用户。如果他们想使用它,那很好,如果他们想坚持使用doSomething的旧方式,什么都不会被破坏。试图在现有函数中硬塞特征或额外的东西很多时候是行不通的。