防止主数据类型C++的隐式转换

Prevent implicit conversion for primary data types C++

本文关键字:转换 C++ 数据类型      更新时间:2023-10-16

BLOT:C++有隐式转换,我正在寻找一种方法来防止它。

让我举一个同样的例子,针对下面的代码片段:

#include <iostream>
int incrementByOne(int i) {
return ++i;
}
int main()
{
bool b = true;

std::cout << incrementByOne(b) << std::endl;
return 0;
}

它将输出:2

如何防止这种隐式转换,并严格要求即使在运行时也只将int作为参数?

我可以想到的一种方法是使函数过载。所以新代码看起来像:

#include <iostream>
int incrementByOne(int i) {
return ++i;
}
int incrementByOne(bool) {
std::cerr << "Please provide integer as argument" << std::endl;
exit(0);
}
int incrementByOne(char) {
std::cerr << "Please provide integer as argument" << std::endl;
exit(0);
}
int main()
{
bool b = true;

std::cout << incrementByOne(b) << std::endl;
return 0;
}

有没有其他(推荐的(方法可以防止运行时的隐式转换?

您可以在template<>delete运算符的帮助下完成此操作:

#include <iostream>
int incrementByOne(int x) {
return ++x;
}
template<class T>
T incrementByOne(T) = delete; // deleting the function
int main(void) {
std::cout << incrementByOne(-10) << std::endl;
std::cout << incrementByOne('a') << std::endl; // will not compile
return 0;
}

在此之后,要传递给函数的参数必须是一个整数。

假设函数参数中给定了一个浮点值,您将得到错误:

main.cpp: In function 'int main()':
main.cpp:11:36: error: use of deleted function 'T incrementByOne(T) [with T = double]'
11 |     std::cout << incrementByOne(3.5) << std::endl;
|                                    ^

如何防止此类隐式转换并严格执行即使在运行时也只将int作为参数?

如果传递的参数不是模板函数的integer,则可以使用static_assert。使用std::is_same检查类型。

#include <type_traits> // std::is_same
template<typename Type>
Type incrementByOne(Type x)
{
static_assert(std::is_same<int, Type>::value, " Some valuable messages");
return ++x;
}