如何使用C++ Concept判断函数是否具有精确匹配的返回类型
精确匹配函数返回类型的实现方案
要实现函数返回类型的精确匹配,核心是抛弃std::convertible_to的隐式转换允许逻辑,直接对函数调用后的实际返回类型做严格相等校验,C++20及以上版本可以通过标准概念组合实现,低版本也可以用类型萃取工具实现。
C++20 概念实现
直接组合std::invocable和std::same_as两个标准概念,配合std::invoke_result_t获取函数调用的实际返回类型:
#include <concepts> #include <type_traits> // 概念定义:Func以Args为参数调用时,返回值严格等于Ret类型 template <typename Func, typename Ret, typename... Args> concept invocable_with_exact_return = std::invocable<Func, Args...> && std::same_as<std::invoke_result_t<Func, Args...>, Ret>;
使用示例
// 测试函数 int get_int() { return 0; } const int& get_const_int_ref() { static int v = 1; return v; } double get_double() { return 2.5; } // 校验通过:返回类型完全匹配 static_assert(invocable_with_exact_return<decltype(get_int), int>); static_assert(invocable_with_exact_return<decltype(get_const_int_ref), const int&>); static_assert(invocable_with_exact_return<decltype(get_double), double>); // 校验失败:类型不严格相等 // static_assert(invocable_with_exact_return<decltype(get_int), long>); // int≠long // static_assert(invocable_with_exact_return<decltype(get_const_int_ref), int>); // const int&≠int
C++17 兼容实现
如果不支持C++20概念,可以用类型萃取工具实现编译期校验:
#include <type_traits> template <typename Func, typename Ret, typename... Args> inline constexpr bool is_invocable_exact_return_v = std::is_invocable_v<Func, Args...> && std::is_same_v<std::invoke_result_t<Func, Args...>, Ret>; // 使用方式 static_assert(is_invocable_exact_return_v<decltype(get_int), int>);
注意事项
- 默认实现会严格区分值类别、cv限定符:
int、int&、const int&、int&&会被判定为不同类型,符合精确匹配的要求 - 如果需要忽略值类别和cv限定符,只匹配底层原始类型,可以将
std::invoke_result_t<Func, Args...>替换为std::decay_t<std::invoke_result_t<Func, Args...>>使用
内容的提问来源于stack exchange,提问作者Bonita Montero
相关产品推荐
相关产品推荐

