C++20概念是否允许将模板函数作为模板参数问题进行修复

Do C++20 concepts enable fixing template function as template argument problem?

本文关键字:问题 参数 函数 是否 C++20      更新时间:2024-05-09

如果你在C++20中尝试一些相对简单的东西,它会因无用的错误消息垃圾邮件而崩溃。

int main() {
auto as = std::vector{1,3,24,};
auto bs = std::vector{1,4,10};
auto cs = std::vector<float>{};
std::ranges::transform(as, bs, std::back_inserter(cs), std::max);
std::ranges::copy(cs, std::ostream_iterator<float>(std::cout, " "));
}

原因是std::max是模板化的函数,所以它不起作用。通过将参数设置为lambda或创建一个小的helper函子,可以很容易地解决这一问题。

但我想知道C++概念是否可以用来告诉我们想要什么样的模板实例化?例如,我们破解了一些requires语句,该语句指出,如果函子参数是模板,那么该函子的模板参数必须与容器value_type匹配。

我怀疑这是可能的,因为我认为在模板重载解析和约束检查开始之前,必须知道函子的确切类型,换句话说;反向传播";从概念到调用站点的信息。

但我不确定,所以我决定问。

如果你想知道我试过什么,这是我的代码,但它很坏,我无法编写模板模板参数代码。。。

但无论如何,我希望它能说明这个想法。。。

template<typename C, typename F>
struct xtransform
{
xtransform(C& c, F f) : c_(c), f_(f){}
void operator()(){
}
C c_;
F f_;
};
template<typename C, template<typename> typename F, typename FArg>
requires requires {
std::is_same_v<typename C::value_type, FArg>;
}
struct xtransform<C, F<FArg>>
{
xtransform(C& c, F<FArg> f) : c_(c), f_(f){}
void operator()(C& c, F<FArg> f){
}
C c_;
F<FArg> f_;
};

否。

std::max命名了一个模板函数。模板参数列表不完整的模板函数名称在重载解析过程中会转换为函数。重载解析需要将函数名转换为指向固定签名的指针,或者使用()s调用

概念没有帮助。

现在你可以用一个老把戏了;在非推导上下文中使用函数指针的函数重载。当我编写类似手动滚动std函数的类型时,正是出于这个原因,我添加了R(*)(Args...)重载;当存在类型完全匹配的重载时,允许进行重载解析。

但这不是基于概念的。