сравнение member fucntion pointers
От: niXman Ниоткуда https://github.com/niXman
Дата: 31.03.20 09:50
Оценка:
привет!

вопрос скорее не про сравнение, но про поиск среди множества MFP одного конкретного.

ситуация: есть некоторое кол-во MFP. сейчас сабж реализован таким способом:
struct type {
    struct mf_stat {
        ...
    };

    template<typename ...Args>
    const mf_stat* get_stat(void(type::*mf)(Args...)) const {
        if ( mem_fn_ptr_equal(&type::m0, mf) ) {
            return std::addressof(m0_stat);
        }
        if ( mem_fn_ptr_equal(&type::m1, mf) ) {
            return std::addressof(m1_stat);
        }
        if ( mem_fn_ptr_equal(&type::m2, mf) ) {
            return std::addressof(m2_stat);
        }

        return nullptr;
    }

private:
    template<typename P>
    static bool mem_fn_ptr_equal(P l, P r) { return l == r; }
    template<typename PL, typename PR>
    static bool mem_fn_ptr_equal(PL, PR) { return false; }

private:
    void m0(int) {}
    mf_stat m0_stat;

    void m1(char) {}
    mf_stat m1_stat;

    void m2(float) {}
    mf_stat m2_stat;
};


обратите внимание на функцию get_stat(). эта финукция генерится препроцессором, т.е. не руками. но вопрос не в этом. вопрос в красивости =)
можно ли как-то это сделать по-красивей и переносимей?
в масив-то не положишь их — сигнатуры могут быть разными...
в switch() — тоже, но не из-за сигнатур.

какие идеи?
Слово "совпадение" появилось после падения сов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.