Arn*_*ler 2 c++ units-of-measurement c++-concepts
我想约束策略类的模板参数。\n也就是说,当我调用 时Foo<policy>,如果策略类不满足我想要的要求,我希望编译器在此处停止。
为了简化问题,我们只考虑策略类必须声明一个静态变量的要求,该静态变量本身满足另一个概念(这里是mp-units 库中的 Acceleration 概念) 。
\n#include <units/isq/si/si.h>\n\nusing units::isq::Acceleration;\n\n// A policy\nstruct earth\n{\n // requirement seems to be fulfilled\n static inline constexpr Acceleration auto gravity = standard_gravity<>;\n};\n\n// Let\'s define a concept because I will need soon to use a set of more than 1 requirements\ntemplate <typename T>\nconcept SphericBody = requires(T)\n{\n { T::gravity } -> Acceleration;\n};\n\n// The host class that has a constraint of the template argument\ntemplate<SphericBody T>\nclass Foo\n{\n // ...\n}\n\nint main()\n{\n Foo<earth> // does not compile :\'(\n}\nRun Code Online (Sandbox Code Playgroud)\n它失败并显示以下编译器消息:
\n\xe2\x80\x98T::gravity\xe2\x80\x99 does not satisfy return-type-requirement\n { T::gravity } -> units::isq::Acceleration;\nRun Code Online (Sandbox Code Playgroud)\n在当前版本的 mp-units 库中,加速概念声明如下:
\n\xe2\x80\x98T::gravity\xe2\x80\x99 does not satisfy return-type-requirement\n { T::gravity } -> units::isq::Acceleration;\nRun Code Online (Sandbox Code Playgroud)\n我究竟做错了什么?
\n我知道这个相关问题:C++ Concepts - Can I have a constraining required a function be present in a class? 但它侧重于非静态成员变量。
\n根据@HolyBlackCat 的要求,我尽力提供一个最小的工作示例。成员变量现在是一个简单的整数。只需添加 require 子句即可:
\n#include <units/concepts.h>\n#include <units/isq/dimensions/length.h>\n#include <units/isq/dimensions/time.h>\n\nnamespace units::isq {\n\ntemplate<typename Child, Unit U, typename...>\nstruct dim_acceleration;\n\ntemplate<typename Child, Unit U, DimensionOfT<dim_length> L, DimensionOfT<dim_time> T>\nstruct dim_acceleration<Child, U, L, T> : derived_dimension<Child, U, exponent<L, 1>, exponent<T, -2>> {};\n\ntemplate<typename T>\nconcept Acceleration = QuantityOfT<T, dim_acceleration>;\n\n} // namespace units::isq\nRun Code Online (Sandbox Code Playgroud)\n在这种情况下,需求被导出到一个概念中,并且不再编译。
\ntemplate <typename T>\nconcept HasGravity = requires(T t)\n{\n { t.gravity } -> std::same_as<int&>;\n};\n\nstruct myearth\n{\n int gravity;\n};\n\n// The host class that has a constraint of the template argument\ntemplate<HasGravity T>\nclass Foo\n{};\n\n// using policy_t = Foo<earth> // compiles\nRun Code Online (Sandbox Code Playgroud)\n错误:
\nnote: constraints not satisfied\ntest.cpp:45:9: required for the satisfaction of \xe2\x80\x98HasGravity<T>\xe2\x80\x99 [with T = myearth]\ntest.cpp:45:22: in requirements with \xe2\x80\x98T t\xe2\x80\x99 [with T = myearth]\ntest.cpp:47:7: note: \xe2\x80\x98t.gravity\xe2\x80\x99 does not satisfy return-type-requirement\n 47 | { t.gravity } -> IsAcceleration;\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
1290 次 |
| 最近记录: |