让我们考虑以下代码:
\n\n#include <concepts>\n\ntemplate<typename X>\nstruct Concrete_M {\n X f() const { return X{}; }\n};\n\nstruct Concrete_X {};\n\ntemplate<typename T, typename X>\nconcept M = requires (T t)\n {\n { t.f() } -> std::convertible_to<X>;\n };\n\ntemplate<M<Concrete_X>>\nstruct C {};\n\nconst C<Concrete_M<Concrete_X>> c{};\nRun Code Online (Sandbox Code Playgroud)\n\n我可以使用以下模板模板参数吗T?
template<template<typename> typename T, typename X>\nconcept M = requires (T<X> t)\n {\n { t.f() } -> std::convertible_to<X>;\n };\nRun Code Online (Sandbox Code Playgroud)\n\n我该如何改变
\n\ntemplate<M<Concrete_X>>\nstruct C {};\n\nconst C<Concrete_M<Concrete_X>> c{};\nRun Code Online (Sandbox Code Playgroud)\n\n正确使用更新概念M?我正在寻找这样的东西:
template<typename X, /* ... */>\nstruct C {};\n\nconst C<Concrete_X, /* ... …Run Code Online (Sandbox Code Playgroud) 这是我使用 C++20 进行柯里化的实现:
#include <concepts>
#include <functional>
constexpr auto
curry(std::invocable auto f)
{
return f();
}
constexpr auto
curry(auto f)
{
return [=](auto x) { return curry(std::bind_front(f, x)); };
}
constexpr int
f(int a, int b, int c)
{
return a * b * c;
}
constexpr auto
g(auto... args)
{
return (1 * ... * args);
}
constexpr int
h()
{
return 42;
}
int
main()
{
static_assert(curry(f)(2)(3)(7) == 42);
static_assert(curry(g<int, int, int, int>)(1)(2)(3)(7) == 42);
static_assert(curry(h) == 42); …Run Code Online (Sandbox Code Playgroud)