如何用C++20的概念来分别限制多个模板参数?
我正在学习C++20概念,并希望独立地对多个模板参数进行限制,使用不同的概念。
#include <concepts>
#include <iostream>
template<typename T>
concept Integer = std::integral<T>;
template<typename T>
concept Float = std::floating_point<T>;
template<Integer T, Float U>
auto multiply(T a, U b) {
return a * b;
}
int main() {
std::cout << multiply(3, 2.5) << '\n';
}
我的预期是第一个参数只能是整型值,第二个参数只能是浮点值,并且它能工作(参见Marek R的 https://godbolt.org/z/vhsvn4WvE)。
这是在C++20中正确的做法吗?或者该如何改进?
解决方案
这个回答综合了上面的几个评论。
你的做法是正确的,但可以简化:
#include <concepts>
#include <iostream>
auto multiply(std::integral auto a, std::floating_point auto b) {
return a * b;
}
int main() {
std::cout << multiply(3, 2.5) << '\n';
// std::cout << multiply(3., 2.5) << '\n';
}
现场演示
现场演示:对比不同调用的效果(感谢Marek R)。
不需要额外的概念(concept),如果你不需要为模板参数命名,可以将 auto 与该概念一起使用。
它具有期望的行为:第一个参数只能传入整型值,且其类型将被推导出来。第二个参数同样也只能是浮点值。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。