Iva*_*vic 9 c++ oop int numeric-limits c++20
公平而简单:如何检查除整数之外的其他任何内容是否已在 C++ 中传递给我的类?
如果我通过 fe achar 'a'我的班级会得到编号97以 ascii 形式。
我试过了,std::numeric_limits但我不明白为什么它没有检测整数:
#include <iostream>
#include <limits>
class integerCheck
{
public:
integerCheck(int value)
{
if((value != std::numeric_limits<int>::is_integer))
return;
std::cout << value << std::endl;
}
};
int main()
{
integerCheck valInt(88);
integerCheck valChar('a');
integerCheck valFloat(13.44f);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我发现这篇文章std::enable_if可以使用,但我无法想象即使在 c++20 中也无法检测到错误的输入,而是将所有内容都包装在模板中。
我错过了什么,我应该寻找/搜索什么来检测除整数值之外的任何东西? 预先感谢
删除带chars的构造函数并制作 ctorexplicit以防止接受floats 如下
class integerCheck
{
public:
explicit integerCheck(int value)
{
std::cout << value << std::endl;
}
integerCheck(char ) = delete;
};
Run Code Online (Sandbox Code Playgroud)
这不允许以下两个构造函数编译
integerCheck valChar('a');
integerCheck valFloat(13.44f);
Run Code Online (Sandbox Code Playgroud)
我认为以下内容会更好地防止除int.
class integerCheck
{
public:
explicit integerCheck(int value)
{
std::cout << value << std::endl;
}
template<class T>
integerCheck(T ) = delete;
};
Run Code Online (Sandbox Code Playgroud)
请注意,过去的代码不会阻止 est 的整数类型,如long, size_t, short, ...
您的构造函数仅将int值作为输入。Achar是整数类型,因此它可以隐式转换为int。浮点类型也是如此。
并且您的使用std::numeric_limits<T>::is_integer不起作用,因为它是真的 when Tis int,就像您在硬编码一样。但对于其他整数类型也是如此,包括char.
如果你想避免隐式转换,你可以通过int非常量引用传递,例如
integerCheck(int &value) {
std::cout << value << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
但是,这意味着您也不能传入整数文字。只有int变量。
更好的解决方案是integerCheck()使用模板参数,然后您可以检查编译器从输入中推断出的模板类型,例如:
#include <type_traits>
template<typename T>
integerCheck(const T &value) {
if constexpr (std::is_same_v<T, int>) {
std::cout << value << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
integerCheck valInt(88); // T=int
integerCheck valChar('a'); // T=char
integerCheck valFloat(13.44f); // T=float
Run Code Online (Sandbox Code Playgroud)