Сообщение Re[3]: сравнение member fucntion pointers от 31.03.2020 12:08
Изменено 31.03.2020 12:16 rg45
Re[3]: сравнение member fucntion pointers
Здравствуйте, niXman, Вы писали:
R>>Сделать get_stat метафункцией — такой вариант не катит? Ну то есть, сделать входной указатель на функцию-член параметром шаблона и результат вычислить в компайл-тайме путем набора специализаций?
X>если я тебя правильно понял — тогда идентификатором мембер-функции будет сигнатура?
X>а значит, два мембера-функции с одинаковой сигнатурой будут восприниматься как одно и тоже?
Нет-нет, параметром должен стать именнто указатель на фунцию-член, а не сигнатура (тип). Нетиповой параметр шаблона. Правда там везде появляется дублирование наподобие <decltype(&type::m1), &type::m1>. Но этот тут случай, когда можно и макросом не побрезговать.
http://coliru.stacked-crooked.com/a/2ca568933ca04de8
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>а значит, два мембера-функции с одинаковой сигнатурой будут восприниматься как одно и тоже?
Нет-нет, параметром должен стать именно указатель на фунцию-член — нетиповой параметр шаблона. Правда там и тип тоже придется таскать за собой, поэтому везде появляется эдакое заикание, типа: <decltype(&type::m1), &type::m1>. Но этот тот случай, когда можно и макросом не побрезговать.
http://coliru.stacked-crooked.com/a/2ca568933ca04de8
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;
}