如何用C++20的概念来分别限制多个模板参数?

编程语言 2026-07-09

我正在学习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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章