【发布时间】:2021-05-27 15:41:19
【问题描述】:
(我正在学习概念和模板,如果我对某些事情有很大的错误,请纠正我。)我有一个将概念作为参数的函数。我现在正试图重载这个需要更具体概念的函数。那会做“更具体的事情”或调用不太具体的函数。
template<typename T>
concept Concept1 = ...;
template<typename T>
concept MoreSpecificConcept = ...;
Concept1 <T> &&
...;
//...
void someFunc(const Concept1 auto& x)
{
//do general stuff
}
void someFunc(const MoreSpecificConcept auto& x)
{
if(...)
{
//do specific stuff
}
else
{
//do the more general thing:
// Problem. Trying to call itself:
someFunc(x);
}
}
有没有办法明确告诉编译器要调用哪个重载(例如 someFunc<Concept1>(x) 不起作用),还是仅取决于传递对象的类型?可以说我不能将x 转换为更通用的类型,并且更通用的功能/概念不知道这个更具体的功能/概念,因此他们不能通过约束排除它。
编辑:这些函数应该在同一个(全局)命名空间内。
【问题讨论】:
-
作为work-araound,仍然将
//do general stuff提取到另一个名称不同的函数中。 -
另一种可能的解决方法是编写一个包装器,它接受
Concept1并通过转发到包装器来满足Concept1:所以someFunc(asConcept1{x});
标签: c++ templates overloading c++20 c++-concepts