如何在C++中实现可接受任意类型参数的add函数并做类型校验?
实现符合需求的C++ add函数(无需函数重载)
完全可以在C++中实现这个需求,无需编写大量函数重载,利用可变参数模板结合**类型萃取(Type Traits)**就能优雅解决。以下是具体实现方案:
核心思路
通过可变参数模板接收任意数量、任意类型的参数,在编译时判断参数数量与类型:
- 参数数量不足2个时,输出参数缺失错误;
- 参数数量为2个时,检查两个参数是否均为整数类型(可选择严格限定为
int或兼容所有整数类型); - 参数数量超过2个或包含非整数类型时,输出对应错误。
完整代码实现
#include <iostream> #include <type_traits> #include <utility> template<typename... Args> void add(Args&&... args) { constexpr size_t arg_count = sizeof...(args); if constexpr (arg_count < 2) { std::cout << "wrong input! missing arguments" << std::endl; } else if constexpr (arg_count == 2) { // 检查所有参数是否为整数类型(兼容int/long/short等所有整数类型) bool is_all_integral = (std::is_integral_v<std::decay_t<Args>> && ...); if (is_all_integral) { auto sum = (args + ...); std::cout << "correct input. addition is " << sum << std::endl; } else { std::cout << "wrong input" << std::endl; } } else { // 参数数量超过2个,输出错误 std::cout << "wrong input" << std::endl; } } // 测试案例 int main() { add(10, 12); // 输出:correct input. addition is 22 add(5); // 输出:wrong input! missing arguments add(10, "hello"); // 输出:wrong input add(3.14, 5); // 输出:wrong input add(1, 2, 3); // 输出:wrong input add(static_cast<long>(20), static_cast<short>(2)); // 输出:correct input. addition is 22 return 0; }
关键细节说明
- 可变参数模板:
template<typename... Args>允许函数接收任意数量、任意类型的参数,彻底避免了函数重载的繁琐。 - 编译时分支处理:
sizeof...(args)获取参数总数,结合if constexpr在编译时完成分支判断,无运行时额外开销。 - 类型检查逻辑:
std::decay_t用于去除参数的引用、const/volatile限定符,确保类型判断准确;std::is_integral_v用于判断参数是否为整数类型(包含int/long/short等)。如果需要严格限定为int类型,只需将判断条件改为:bool is_all_int = (std::is_same_v<std::decay_t<Args>, int> && ...);
- 折叠表达式:
(std::is_integral_v<...> && ...)和(args + ...)是C++17引入的语法,简洁实现了参数包的遍历与运算。
内容的提问来源于stack exchange,提问作者Ankit Chanda
相关产品推荐
相关产品推荐

