Я работаю над инструментом мониторинга, и я сосредотачиваюсь на низких издержках времени выполнения и простом API. Для переключения включения / выключения с минимальными затратами времени выполнения я решил использовать шаблон состояния, а для упрощения использования я собирался использовать пакеты параметров шаблона.
И теперь я впервые m борется за границу, разделяющую время компиляции и время выполнения, и, конечно, не может заставить работать функцию виртуального шаблона.
Я ищу обходной путь или эквивалентное решение с учетом следующих ограничений:
- Самая низкая стоимость времени выполнения в состоянии «отключено»
- Гибкий API
- Соответствие Pre C ++ 17
И если это невозможно, то тоже хорошо ...
Пример кода:
static struct /*Disabled*/ State
{
template <typename... Args>
/*virtual*/ void operator()(const char * category, Args&&... args) { /*noop*/ }
}
disabled;
static struct Enabled : State
{
template <typename... Args>
/*virtual*/ void operator()(const char * category, Args&&... args) { /*processing category and args*/ }
}
enabled;
struct Monitor
{
static State* state;
template <typename... Args>
static void write(const char * category, Args&&... args)
{
state->operator()(category, std::forward<Args>(args)...);
}
};
State* Monitor::state = &enabled;
int main()
{
Monitor::write("BulletCount", 42);
Monitor::write("Spell", "EnergyShield", true);
}
код выше компилируется, но я никогда не смогу достичь состояния Enabled
без виртуального наследования. Удаление шаблона и множество перегрузок сделают это, но если этого можно будет избежать, это может стать довольно элегантным решением.