Информация об изменениях

Сообщение Re[3]: сравнение member fucntion pointers от 31.03.2020 12:08

Изменено 31.03.2020 12:17 rg45

Re[3]: сравнение member fucntion pointers
Здравствуйте, niXman, Вы писали:

R>>Сделать get_stat метафункцией — такой вариант не катит? Ну то есть, сделать входной указатель на функцию-член параметром шаблона и результат вычислить в компайл-тайме путем набора специализаций?


X>если я тебя правильно понял — тогда идентификатором мембер-функции будет сигнатура?

X>а значит, два мембера-функции с одинаковой сигнатурой будут восприниматься как одно и тоже?

Нет-нет, параметром должен стать именно указатель на фунцию-член — нетиповой параметр шаблона. Правда там и тип тоже придется таскать за собой, поэтому везде появляется эдакое заикание, типа: <decltype(&type::m1), &type::m1>. Но этот тот случай, когда можно и макросом не побрезговать.

http://coliru.stacked-crooked.com/a/2ca568933ca04de8

#include <iostream>

struct type {
    struct mf_stat {
    };

    template <typename T, T>
    const mf_stat* get_stat() const;

    void m0(int) {}
    mf_stat m0_stat;
    
    void m1(char) {}
    mf_stat m1_stat;

    void m2(float) {}
    mf_stat m2_stat;

};

template <typename T, T>
const type::mf_stat* type::get_stat() const { return nullptr; }

template <>
const type::mf_stat* type::get_stat<decltype(&type::m0), &type::m0>() const { return &m0_stat; }

template <>
const type::mf_stat* type::get_stat<decltype(&type::m1), &type::m1>() const { return &m1_stat; }

template <>
const type::mf_stat* type::get_stat<decltype(&type::m2), &type::m2>() const { return &m2_stat; }


int main() {

    const type t;

    std::cout << std::boolalpha;
    std::cout << t.get_stat<decltype(&type::m0), &type::m0>() << std::endl;
    std::cout << t.get_stat<decltype(&type::m1), &type::m1>() << std::endl;
    std::cout << t.get_stat<decltype(&type::m2), &type::m2>() << std::endl;
}
Re[3]: сравнение member fucntion pointers
Здравствуйте, niXman, Вы писали:

R>>Сделать get_stat метафункцией — такой вариант не катит? Ну то есть, сделать входной указатель на функцию-член параметром шаблона и результат вычислить в компайл-тайме путем набора специализаций?


X>если я тебя правильно понял — тогда идентификатором мембер-функции будет сигнатура?

X>а значит, два мембера-функции с одинаковой сигнатурой будут восприниматься как одно и тоже?

Нет-нет, параметром должен стать именно указатель на фунцию-член — нетиповой параметр шаблона. Правда там и тип тоже придется таскать за собой, к сожалению, поэтому везде появляется эдакое заикание, вида: get_stat<decltype(&type::m1), &type::m1>(). Но этот тот случай, когда можно и макросом не побрезговать.

http://coliru.stacked-crooked.com/a/2ca568933ca04de8

#include <iostream>

struct type {
    struct mf_stat {
    };

    template <typename T, T>
    const mf_stat* get_stat() const;

    void m0(int) {}
    mf_stat m0_stat;
    
    void m1(char) {}
    mf_stat m1_stat;

    void m2(float) {}
    mf_stat m2_stat;

};

template <typename T, T>
const type::mf_stat* type::get_stat() const { return nullptr; }

template <>
const type::mf_stat* type::get_stat<decltype(&type::m0), &type::m0>() const { return &m0_stat; }

template <>
const type::mf_stat* type::get_stat<decltype(&type::m1), &type::m1>() const { return &m1_stat; }

template <>
const type::mf_stat* type::get_stat<decltype(&type::m2), &type::m2>() const { return &m2_stat; }


int main() {

    const type t;

    std::cout << std::boolalpha;
    std::cout << t.get_stat<decltype(&type::m0), &type::m0>() << std::endl;
    std::cout << t.get_stat<decltype(&type::m1), &type::m1>() << std::endl;
    std::cout << t.get_stat<decltype(&type::m2), &type::m2>() << std::endl;
}