C++ 做C++;20个概念是否允许将模板函数修复为模板参数问题?

C++ 做C++;20个概念是否允许将模板函数修复为模板参数问题?,c++,c++20,c++-concepts,template-templates,C++,C++20,C++ Concepts,Template Templates,如果你在C++20中尝试一些相对简单的东西,它会随着时间而内爆 没有 std::max命名模板函数。在重载解析过程中,模板参数列表不完整的模板函数名将转换为函数。重载解析需要将函数名转换为指向固定签名的指针,或使用()s调用 概念没有帮助 现在你可以使用一个老把戏;有一个函数重载,它在非推断上下文中接受函数指针。当我编写类似类型的手动std函数时,我添加了一个R(*)(Args…重载,正是出于这个原因;当存在类型完全匹配的重载时,这允许重载解析 但这不是基于概念的。我怀疑这是可能的,因为我认为在

如果你在C++20中尝试一些相对简单的东西,它会随着时间而内爆

没有

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

概念没有帮助

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


但这不是基于概念的。

我怀疑这是可能的,因为我认为在模板重载解析和约束检查正确启动之前,必须知道函子的确切类型。名称
std::max
为模板命名。你不能从中得到具体的东西。我想如果添加了一个重载,并使用了一个模板参数,这个问题是可以解决的。@NathanOliver是你最后一句话,谈论语言更改或代码更改吗?因为这就是我想做的。不是语言的改变,而是标准的库的改变。至少我认为它可以通过改变图书馆来修复。我有些怀疑,因为我仍然认为您需要一个传递给函数的具体对象。@NathanOliver:模板参数必须是类/别名模板;函数模板只是在(它们自己的!)重载解析过程中才会出现。@NathanOliver我认为最简单的库更改应该是将
std::max
a neibloid,尽管这会破坏现有代码。嗨,你有没有在其他SO答案中写过你的解决方案的示例?@nosense可能?我在这里写了一堆std函数替换。但不知道是哪个。
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, " "));
}
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_;
};