我如何检测除了整数以外的任何东西都传递给我的 class 构造函数?
How do I detect if anything but an integer is passed to my class constructor?
公平而简单:我如何检查除整数以外的其他任何东西是否传递给我的 c++ 中的 class?
如果我通过f.e。 a char 'a'
我的 class 得到 ascii 格式的数字 97
。
我试过 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;
}
我发现 this Post 与 std::enable_if
一起工作,但我无法想象即使在 c++20 中也无法检测错误输入,而是将所有内容包装在模板中.
我错过了什么,我应该 look/search 什么来检测整数值以外的任何东西?
先谢谢
删除取char
s的构造函数,使ctorexplicit
防止接受float
s如下
class integerCheck
{
public:
explicit integerCheck(int value)
{
std::cout << value << std::endl;
}
integerCheck(char ) = delete;
};
这不允许以下两个 ctors 编译
integerCheck valChar('a');
integerCheck valFloat(13.44f);
我认为以下将更好地防止除 int
.
之外的所有类型
class integerCheck
{
public:
explicit integerCheck(int value)
{
std::cout << value << std::endl;
}
template<class T>
integerCheck(T ) = delete;
};
请注意,过去的代码并没有阻止像 long
、size_t
、short
、...
这样的整数类型。
大概是这样的:
class integerCheck
{
public:
// Arguments of type other than `int` go here.
template <typename T>
integerCheck(T) {}
integerCheck(int value) {
std::cout << value << std::endl;
}
};
您的构造函数仅将 int
值作为输入。 char
是整数类型,因此它可以隐式转换为 int
。浮点类型也是如此。
并且您对 std::numeric_limits<T>::is_integer
的使用不起作用,因为当 T
为 int
时它是正确的,就像您在硬编码一样。但这也适用于其他整数类型,包括 char
.
如果你想避免隐式转换,你可以通过非常量引用传递 int
,例如
integerCheck(int &value) {
std::cout << value << std::endl;
}
但是,这意味着您也不能传入整型文字。只有 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;
}
}
integerCheck valInt(88); // T=int
integerCheck valChar('a'); // T=char
integerCheck valFloat(13.44f); // T=float
公平而简单:我如何检查除整数以外的其他任何东西是否传递给我的 c++ 中的 class?
如果我通过f.e。 a char 'a'
我的 class 得到 ascii 格式的数字 97
。
我试过 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;
}
我发现 this Post 与 std::enable_if
一起工作,但我无法想象即使在 c++20 中也无法检测错误输入,而是将所有内容包装在模板中.
我错过了什么,我应该 look/search 什么来检测整数值以外的任何东西? 先谢谢
删除取char
s的构造函数,使ctorexplicit
防止接受float
s如下
class integerCheck
{
public:
explicit integerCheck(int value)
{
std::cout << value << std::endl;
}
integerCheck(char ) = delete;
};
这不允许以下两个 ctors 编译
integerCheck valChar('a');
integerCheck valFloat(13.44f);
我认为以下将更好地防止除 int
.
class integerCheck
{
public:
explicit integerCheck(int value)
{
std::cout << value << std::endl;
}
template<class T>
integerCheck(T ) = delete;
};
请注意,过去的代码并没有阻止像 long
、size_t
、short
、...
大概是这样的:
class integerCheck
{
public:
// Arguments of type other than `int` go here.
template <typename T>
integerCheck(T) {}
integerCheck(int value) {
std::cout << value << std::endl;
}
};
您的构造函数仅将 int
值作为输入。 char
是整数类型,因此它可以隐式转换为 int
。浮点类型也是如此。
并且您对 std::numeric_limits<T>::is_integer
的使用不起作用,因为当 T
为 int
时它是正确的,就像您在硬编码一样。但这也适用于其他整数类型,包括 char
.
如果你想避免隐式转换,你可以通过非常量引用传递 int
,例如
integerCheck(int &value) {
std::cout << value << std::endl;
}
但是,这意味着您也不能传入整型文字。只有 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;
}
}
integerCheck valInt(88); // T=int
integerCheck valChar('a'); // T=char
integerCheck valFloat(13.44f); // T=float