C++限制函数参数类型
一、背景
函数需要的参数为无符号整数,而用户可能会错误的传入有符号整数,如下。
#include <iostream>
class Foo {
public:
void foo(std::size_t n);
};
int main(int argc, char** argv) {
Foo foo;
int source = -10; // 如何避免这种情况?
foo.foo(source);
return 0;
}
二、解决方法
方法1:通过重载
class Foo {
public:
template <typename T>
void foo(T n) = delete;
void foo(std::size_t n);
};
方法2 :通过断言 static_assert()
class Foo {
public:
template <typename T>
void foo(T n) {
static_assert(std::is_unsigned_v<T>, "n must be unsigned integeral type!");
}
};
方法3:使用C++20中的concept
class Foo {
public:
template <std::unsigned_integral T>
void foo(T n);
};
方法4:使用C++20中的requires
class Foo {
public:
template <typename T>
requires(std::is_unsigned_v<T>)
void foo(T n);
};
三、总结
- 通过提前约束可以避免使用者错误使用接口;
- 写法很多,能用高版本C++就用高版本。