最明显的方法是只写两个函数,但它们几乎是一样的。我现在正在做的是一个以返回类型(bool
或 vector<something>
)作为参数的函数模板
template<typename ReturnType>
ReturnType foo(...){
constexpr bool return_bool = std::is_same<ReturnType, bool>::value;
ResultType results; //hopefully, the compiler takes it out in the bool case
计划是使用if constexpr(return_bool)
需要的时候。但是后来我得到了这段重复出现的代码
ReturnType result = foo<ResultType>(...);
if constexpr(return_bool){
if(result) return true;
}else std::copy(result.begin(), result.end(), std::back_inserter(results));
return 语句使得使用标准反重复技术变得困难。我可以使用宏,但也许重复会更好。获取所有解决方案或仅获取某个解决方案是否存在的信息似乎是一个相当普遍的问题,是否有更好的方法来做到这一点?
我应该补充说,该函数在“是否存在解决方案?”中对性能至关重要。案件。这就是为什么我想在那里有另一个版本,也是为什么我不想要任何昂贵的抽象。
最佳答案
你想要两个相反的特征:
- 在另一种解决方案中重复使用一种解决方案以避免复制
- 拥有 solutionExists() 的优化版本以避免搜索完整结果
您没有指定您的函数返回的解决方案是什么,所以我将使用一个简单的示例来解释为什么您不能同时拥有这两个解决方案:您的函数在一个整数 vector 中返回 0 的出现次数。
返回所有解决方案的函数如下所示:
int GetNumberOfOccurencesOf0(const vector<int>& data)
{
int occurences = 0;
for (int i : data)
{
if (i == 0)
++occurences;
}
return occurences;
}
如果您不关心性能,如果有解决方案则返回的函数可以是:
bool AreThereOccurencesOf0(const vector<int>& data)
{
return (GetNumberOfOccurencesOf0(data) > 0);
}
请注意,没有代码重复,但解决方案不是最优的:数据 vector 被完全迭代。如果你想要一个优化的解决方案,它看起来像这样:
bool AreThereOccurencesOf0(const vector<int>& data)
{
for (int i : data)
{
if (i == 0)
return true;
}
return false;
}
如果您的问题需要 solutionExists() 的优化版本,您应该编写它并且它不需要重用 getAllSolutions() 函数中的代码。 p>
关于c++ - 如何巧妙地编写两个函数 - 一个用于检查解决方案是否存在,另一个用于获取所有解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62540888/