Я сталкиваюсь со странной редкой проблемой, которую я хочу скрыть функцией Базового класса B::f1(int)
.
class B{
public: void f1(int){}
public: void f1(float){}
};
class C : public B{
public: void f1(int){
//static_assert(ASSERT_that_thisFunctionHidParentFunction,"");
//some rare ugly hacky stuff
}
public: void f1(char){
//static_assert(!ASSERT_that_thisFunctionHidParentFunction,"");
}
};
Все отлично работает; Я просто беспокоюсь за ремонтопригодность.
Я хочу убедиться, что функция C::f1(int)
всегда скрывает B::f1(int)
.
Если B::f1(int)
изменит подпись в будущем (например, на B::f1(int,int)
),
Я хочу, чтобы какая-то ошибка компиляции сообщала программистам, что C::f1(int)
также следует изменить на C::f1(int,int)
.
В реальном мире моя проблемная функция f1
не перегружена.
Но для образовательных целей я хочу знать, как решить эту проблему, если есть и перегрузка. (т.е. необязательно)
Мне нравится симпатичное решение, подобное ASSERT_that_thisFunctionHidParentFunction
в моем комментарии к коду.
Я не против MACRO.
Мое плохое решение
Я попытался ввести def для принудительного вызова ошибки компиляции, но в некоторых случаях он не выдает ошибку-сбой ( MCVE-coliru ), поскольку int
автоматически приводится к B::f1(float)
.
class B{
public: void f1(int,int){}
public: void f1(float){}
};
class C : public B{
public: void f1(int){
using XXX=decltype(std::declval<B>().f1(std::declval<int>()));
//static_assert(ASSERT_that_thisFunctionHidParentFunction,"");
}
public: void f1(char){
//static_assert(!ASSERT_that_thisFunctionHidParentFunction,"");
}
};
int main() {
return 0;
}