jeudi 29 juillet 2021

Pointer to member function of instance instead of class

I have the following class when I get a pointer to a member function according to some condition and then call the function.

class Test
{
public:
    bool isChar(char ch) { return (ch >= 'a' && ch <= 'z'); }
    bool isNumeric(char ch) { return (ch >= '0' && ch <= '0'); }

    enum class TestType
    {
        Undefined,
        Char,
        Numeric,
        AnotherOne,
    };

    bool TestFor(TestType type, char ch)
    {
        typedef bool (Test::*fptr)(char);
        fptr f = nullptr;
        switch(type)
        {
            case TestType::Char:
                f = &Test::isChar;
                break;
            case TestType::Numeric:
                f = &Test::isNumeric;
                break;
            default: break;
        }

        if(f != nullptr)
        {
            return (this->*f)(ch);
        }

        return false;
    }
};

But actually I don't like the syntax. Is there a way to replace

(this->*f)(ch)

with

f(ch)

?

In my real code the function a big enough and it's not so clear what (this->*f) is. I'm looking for some c++11 solution. I know about std::function and I will use it if if no solution will be found.

Update

The solution that I decided to use, if suddenly someone needs it: (thanks for @StoryTeller - Unslander Monica)

bool TestFor(TestType type, char ch)
{        
    bool(Test::* fptr)(char) = nullptr;
    switch(type)
    {
        case TestType::Char:
            fptr = &Test::isChar;
            break;
        case TestType::Numeric:
            fptr = &Test::isNumeric;
            break;
        default: break;
    }

    if(fptr != nullptr)
    {
        auto caller = std::mem_fn(fptr);
        caller(this, ch);
    }

    return false;
}

Aucun commentaire:

Enregistrer un commentaire