Search code examples
c++oopintc++20numeric-limits

How do I detect if anything but an integer is passed to my class constructor?


Fair and simple: How do I check if anything else but an integer is passed to my class in c++?

If I pass f.e. a char 'a' my class gets number 97 in ascii.

I tried std::numeric_limits but I don't get why it is not detecting integers:

#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;
}

I found this Post working with std::enable_if but I can't imagine there is no way to detect wrong input even in c++20 but wrapping everything in a template.

What am I missing, what should I look/search for to detect anything but an integer value? Thanks upfront


Solution

  • Delete the constructor taking chars and make the ctor explicit to prevent accepting floats as follows

    class integerCheck
    {
    public:
        explicit integerCheck(int value)
        {
    
            std::cout << value << std::endl;
        }
        integerCheck(char ) = delete;
    };
    

    This doesn't allow the two following ctors to compile

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

    I think the following will be better to prevent all of types except int.

    class integerCheck
    {
    public:
        explicit integerCheck(int value)
        {
    
            std::cout << value << std::endl;
        }
    
        template<class T>
        integerCheck(T ) = delete;
    };
    

    Notice that the past code doesn't prevent the est of the integral types like long, size_t, short, ...