Size: a a a

2020 July 29

АК

Александр Караев... in pro.cxx
нет, этот трейт проверяет, что какой-то тип - это тип указателя на функцию-член, про тип класса он не знает (да и если бы знал, не помог)
источник

AF

Aidar Fattakhov in pro.cxx
Александр Караев
Существуют ли способы проверить, что какой-либо метод класса реализован именно в классе T, а не в одном из его родителей?

struct A { void foo(); };
struct B : A { void bar(); };

static_assert(is_B_method(&B::bar));
static_assert(!is_B_method(&B::foo));


Способы, требующие явного перечисления родителей каждого класса, очевидно, не подходят
А возможные родители известны?
источник

АК

Александр Караев... in pro.cxx
Aidar Fattakhov
А возможные родители известны?
я уточнил, что перечисление родителей не подходит (иначе я бы просто их перечислил и проверил, логично)
источник

АК

Александр Караев... in pro.cxx
вообще задача такая - требовать у классов наличие некоторого статического метода, который я тупо могу забыть написать и будет использован метод родителя, что мне не нужно
источник

AF

Aidar Fattakhov in pro.cxx
Не знаю способа, думаю его нет
источник

АК

Александр Караев... in pro.cxx
мне в голову пришло обходное решение - добавить фиктивный аргумент tag<T> этому статическому методу в каждом классе T, чтобы они "перестали" наследоваться
источник

В

Владимир in pro.cxx
Александр Караев
Существуют ли способы проверить, что какой-либо метод класса реализован именно в классе T, а не в одном из его родителей?

struct A { void foo(); };
struct B : A { void bar(); };

static_assert(is_B_method(&B::bar));
static_assert(!is_B_method(&B::foo));


Способы, требующие явного перечисления родителей каждого класса, очевидно, не подходят
Я бы пошел таким путем, определил бы указатели на члены класса:
template<typename T> 
struct ptr_Mem:
std::false_type {};
template<typename T, class C >
struct ptr_Mem<T C::*> :
std::true_type {....};
источник

АК

Александр Караев... in pro.cxx
Владимир
Я бы пошел таким путем, определил бы указатели на члены класса:
template<typename T> 
struct ptr_Mem:
std::false_type {};
template<typename T, class C >
struct ptr_Mem<T C::*> :
std::true_type {....};
выглядит как переизобретение https://en.cppreference.com/w/cpp/types/is_member_function_pointer
источник

В

Владимир in pro.cxx
Какое длинное название.
источник

S

Spoonson in pro.cxx
@smertig а метод родителя может быть использован в какой-то ситуации?
источник

АК

Александр Караев... in pro.cxx
Spoonson
@smertig а метод родителя может быть использован в какой-то ситуации?
только если явно идёт обращение к родительскому классу
источник

S

Spoonson in pro.cxx
Александр Караев
только если явно идёт обращение к родительскому классу
https://godbolt.org/z/G1ab1M идея примерно такая, попробовать shadowing использовать. Пока не будет test в Bar ничего не заработает, правда &Foo::test не заработает пока явно не скастишь его.
источник

АК

Александр Караев... in pro.cxx
https://godbolt.org/z/4MKb9s
постановка задачи и мой вариант решения
источник

S

Spoonson in pro.cxx
Александр Караев
https://godbolt.org/z/4MKb9s
постановка задачи и мой вариант решения
https://godbolt.org/z/31brTT вот так вот примерно
источник

АК

Александр Караев... in pro.cxx
ломается на struct C : B {}
источник

S

Spoonson in pro.cxx
если иеархия длинная и глубокая, то работать не будет
источник

S

Spoonson in pro.cxx
Александр Караев
ломается на struct C : B {}
да, это так
источник

AS

Anatoly Shirokov in pro.cxx
Александр Караев
мне в голову пришло обходное решение - добавить фиктивный аргумент tag<T> этому статическому методу в каждом классе T, чтобы они "перестали" наследоваться
железобетонный вариант
источник

AS

Anatoly Shirokov in pro.cxx
тегирование решает многие задачи, мы у себя помечаем тегами параметры вызова хранимок, меняется сигнатура хранимки, ломается компиляция
источник

DF

Dollar Føølish in pro.cxx
Да блин это гениально
источник