如何在需求表达式中重用函数调用的返回类型?

cig*_*ien 8 c++ templates c++-concepts requires-expression

我正在编写一个概念,检查类型是否可以在组成 2 个函数的表达式中使用:

template<typename T>
concept C = requires(T t) {
    f(g(t));
};
Run Code Online (Sandbox Code Playgroud)

即,我想检查对于给定的t类型 的对象T,我是否可以调用g(t),然后使用结果值作为 的参数f。例如,

auto g(int)  -> float;   
auto g(char) -> double; 

void f(float);
void f(double) = delete;

static_assert(C<int>);       // g(int) returns a float, so f(float) is called.
static_assert(not C<char>);  // g(char) returns a double, but f(double) is deleted
Run Code Online (Sandbox Code Playgroud)

这很好用。

但是,我想拆分对fand的调用g,因为 1)g可能需要额外的参数(不依赖于),从而导致冗长T的调用,2) 我可能想在g概念,所以我不想多次重复调用。

像下面这样的天真尝试

auto res = g(t);
f(res);
Run Code Online (Sandbox Code Playgroud)

using ret_t = decltype(g(t));
f(ret_t{});
Run Code Online (Sandbox Code Playgroud)

不要在概念内部工作。

f(g(t))有没有某种方法可以以不需要g(t)在调用中写入的方式实现 的拆分f

Sto*_*ica 7

嵌套需求可以是一个选项:

template<typename T>
concept C = requires(T t) {
    g(t);   // Not strictly needed, I think, but explicit verification might be more readable if the concept fails in a template
    requires requires(decltype(g(t)) s) { // Can reuse s how many time we want
        f(s);
    };
};
Run Code Online (Sandbox Code Playgroud)

是的,这里需要要求以确保f(s)也经过验证。