如何检测是否有除整数以外的任何东西传递给c ++中的类?

问题描述 投票:3回答:3

公平而简单:如何检查除整数以外的其他内容是否在C ++中传递给了我的课程?

如果我通过f.e.我班级的char 'a'以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中也无法检测到错误的输入,而是将所有内容包装在模板中。

我想念的东西,我应该寻找/寻找什么以检测除整数之外的任何东西?预先感谢

c++ int numeric-limits
3个回答
3
投票

删除构造函数,并以char的形式构造ctor explicit,以防止按如下方式接受float

class integerCheck
{
public:
    explicit integerCheck(int value)
    {

        std::cout << value << std::endl;
    }
    integerCheck(char ) = delete;
};

这不允许以下两个ctor进行编译

integerCheck valChar('a');
integerCheck valFloat(13.44f);

3
投票

沿着这些思路,也许:

class integerCheck
{
public:
    // Arguments of type other than `int` go here.
    template <typename T>
    integerCheck(T) {}

    integerCheck(int value) {
       std::cout << value << std::endl;
    }
};

3
投票

您的构造函数仅将int值用作输入。 char是整数类型,因此可以隐式转换为int。浮点类型也是如此。

并且您对std::numeric_limits<T>::is_integer的使用不起作用,因为当Tint时,它是正确的,就像您正在硬编码一样。但是对于其他整数类型(包括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
© www.soinside.com 2019 - 2024. All rights reserved.