【发布时间】:2021-04-14 18:17:23
【问题描述】:
我正在使用 C++20,我想知道 Concepts 是否有可能解决这种情况。
假设我有一个函数:
template <typename F>
void doSomething(F f) {
f();
}
doSomething 接受一个可调用对象(技术上是 lambda,但我认为这无关紧要)& 我想确保 F 的成员变量不具有 T 类型。例如,我想要:
BadType t;
int x = ...;
double y = ...;
doSomething([t = kj::mv(t), x, y] { ... }); // I want a compile error
doSomething([x, y] { ... }); // No error.
同样,我想以类似的方式验证可调用的参数:
doSomething([x, y](BadType t) { ... }); // I want a compile error
doSomething([x, y](std::vector<int> c) { ... }); // No compile error
我不知道这是否会使事情复杂化,但从技术上讲,BadType 本身就是一个模板类型(无论模板值如何,我都想禁用所有实例)。
一个可接受的答案可能是一个提供示例的答案,但我也很高兴有人认为我应该能够拼凑完成的优秀教程。我在 C++ 和模板元编程方面非常有经验,但目前的概念感觉像是完全陌生的东西。当然,如果这是不可能的,那么也很乐意接受这样的答案。
这感觉像是反射 TS 非常适合的东西,但是即使在 v13 中,clang 也无法以一种可访问的方式实现这一点(我认为 GCC 的工作仍然在非主线分支中)。我已经探索了 C++17 的各种静态反射库,但它们都需要修改类型,这在此处是不可能的,因为我正在内省 lambda(并且BadType 是在 3p 中定义的类型图书馆虽然这不重要)。
我怀疑答案一定是否定的,因为我传入的每个 lambda 都会有一组任意的名称,用于捕获的变量以及我见过的试图强制执行的概念的唯一示例成员变量的类型需要一个已知的变量名,但这对于概念大师来说可能是一个有趣的挑战。
【问题讨论】:
-
"确保 F 的成员变量没有类型 T" 这是完全不可能的。 “验证可调用的参数”目前还不太清楚你想要验证什么。您正在调用不带参数的可调用对象,因此接受任何参数的可调用对象将导致编译错误。
-
阅读这篇文章,了解为什么要转发函子:stackoverflow.com/questions/24779910/…
-
@n.'pronouns'm.: ""确保 F 的成员变量不具有 T 类型"这完全不可能"。错误的。看我的回答。
-
你为什么要这个?我很难找到这样做的理由。
-
@VittorioRomeo lambda 既不是简单的结构也不是聚合。
标签: c++ c++20 c++-concepts