Здесь создается vtable?
Да, поскольку у вас есть virtual
функций-членов.
Имеет ли значение для меня, если создается vtable или нет, , поскольку я им не пользуюсь ?
Поскольку вы не используете его, все равно имеет значение в том смысле, что он увеличит размер вашего Derived
структура. Здесь ваша Derived
структура имеет размер 8. Но без vtable она будет иметь размер 1.
Может быть, есть другой способ убедиться, что компилятор пожалуется, если Derived
не реализовать f()
?
Если честно, я думаю, что ваше решение, использующее Base
в качестве интерфейса для того, чтобы заставить каждый производный класс реализовать функцию f()
, вполне нормально, так как это точный сценарий использования интерфейсов .
Но если размер структуры Derived
вызывает беспокойство (потому что вы сказали, что хотите создать его миллион раз ), возможно, вас заинтересует признак типа std::is_member_function_pointer
.
Я понятия не имею, как вы намереваетесь создать экземпляр структуры Derived
, поэтому я не могу предоставить код, который бы точно соответствует вашим потребностям. Но идея, о которой я думаю, эквивалентна следующему (пример generi c):
#include <type_traits>
template <typename T>
void instantiate_a_lot_of_times(std::size_t nb_times)
{
// Check if the f() member function exists
static_assert(std::is_member_function_pointer<decltype(&T::f)>::value, "Error: The T::f() member function must be defined");
for(std::size_t i = 0; i < nb_times; ++i)
{
T t;
// Do something with t
}
}
Но имейте в виду, что у этого подхода есть недостаток задержки проверки. Компиляция не завершится неудачей, когда будет найдено определение структуры, но при оценке static_assert
.