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?
嵌套需求可以是一个选项:
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)也经过验证。