Я пытаюсь создать структуру с условными членами, это означает, что разные члены существуют только с определенной специализацией. Но я хочу, чтобы эти занятия были максимально быстрыми. Я пробовал это тремя разными способами:
template
struct foo
{
template
foo(Args&&... args) : m_t(forward(args)...)
{}
virtual ~foo() {}
T m_t;
}
template
struct foo : public foo
{
using foo::foo;
int m_id = 0;
};
Преимущество: мало кода.
Недостаток: использование виртуальных таблиц/наследования/и т. д.: больше времени на создание или доступ к членам? Но, с другой стороны, я не претендую на использование «ссылок» на базовый класс. Каковы реальные преимущества и недостатки этого подхода?
Ventages: напишите код один раз; когда with_int имеет значение false, поле m_int имеет размер 0 (почти в gcc 4.7.2).
Преимущества: больше использования шаблонов (уменьшает читабельность), и я не уверен, как компиляторы справляются с членами размера 0. Я действительно не знаю, в какой степени поле размера 0 опасно или имеет смысл. Повторяющиеся конструкторы, но, возможно, этого можно избежать.
Я пытаюсь создать структуру с условными членами, это означает, что разные члены существуют только с определенной специализацией. Но я хочу, чтобы эти занятия были максимально быстрыми. Я пробовал это тремя разными способами:
template struct foo : public foo { using foo::foo;
int m_id = 0; }; [/code]
[list] [*]Преимущество: мало кода. [*]Недостаток: использование виртуальных таблиц/наследования/и т. д.: больше времени на создание или доступ к членам? Но, с другой стороны, я не претендую на использование «ссылок» на базовый класс. Каковы реальные преимущества и недостатки этого подхода? [/list]
[b]Путь 3[/b]
[code] using nil_type = void*; using zero_type = nil_type[0];
T m__t; typename conditional::type m_int; }; [/code]
[list] [*]Ventages: напишите код один раз; когда with_int имеет значение false, поле m_int имеет размер 0 (почти в gcc 4.7.2). [*]Преимущества: больше использования шаблонов (уменьшает читабельность), и я не уверен, как компиляторы справляются с членами размера 0. Я действительно не знаю, в какой степени поле размера 0 опасно или имеет смысл. Повторяющиеся конструкторы, но, возможно, этого можно избежать. [/list]