Тест, является ли класс полиморфным

Мы использовали Базу данных Журнала в моем последнем задании, и это было большим.

у Нас были хранимые процедуры, которые выложат обзоры общего системного здоровья для различных метрик, которые я мог загрузить из веб-страницы. Мы могли также быстро выложить трассировку для данного приложения за установленный срок, и если я хотел его, было легко получить это как текстовый файл, если Вы действительно точно так же, как файлы grep-луга.

Для обеспечения системы регистрации самостоятельно не становится проблемой, существует, конечно, общая платформа кода, которую мы использовали среди различных приложений, которые обработали запись в таблицу журнала. Часть той платформы включала также вход в файл, в случае, если проблема с самой базой данных, и часть его включает циклическое повторение журналов. Что касается проблем пространства, база данных журнала находится на различном расписании резервного копирования, и это - действительно не проблема. Пространство (not-backed-up) является дешевым.

я думаю, что обращается к большинству проблем, выраженных в другом месте. Это - весь вопрос реализации. Но если бы я остановился здесь, то это все еще был бы случай "не намного хуже", и это - плохая причина пойти проблема настроить вход DB. То, что я любил об этом, - то, что это позволило нам делать [приблизительно 111] новые вещи , который будет намного тяжелее относиться к плоским файлам.

было четыре основных улучшения по сравнению с файлами. Первыми являются системные обзоры, которые я уже упомянул. Второе, и imo самый важный, была проверка, чтобы видеть, пропускало ли какое-либо приложение сообщения, где мы обычно ожидали бы находить их. Такую вещь почти невозможно определить в традиционном входе файла, если Вы не проводите много времени каждый день, рассматривая отупляющие журналы для приложений, которые просто говорят Вам, что все - хорошо 99% времени. Удивительно, как освобождение представления для показа недостающих записей в журнале. Большинство дней мы не должны были смотреть на большинство файлов журнала вообще... что-то, что будет опасным и безответственным без базы данных.

, Который поднимает третье улучшение. Мы генерировали единственное ежедневное электронное письмо состояния, и это было [только 112] вещь, которую мы должны были рассмотреть в дни, которые все обычно выполняло. Включенная электронная почта показала ошибки и предупреждения. Недостающие журналы были повторно зарегистрированы как предупреждение тем же заданием дб, которое посылает электронное письмо, и отсутствие электронной почты было грандиозным предприятием. Мы могли отправить, передают конкретное сообщение журнала к нашему средству отслеживания ошибки одним щелчком, прямо из ежедневной электронной почты (это было отформатировано HTML, вытянутые данные из веб-приложения).

заключительное улучшение было то, что, если мы действительно хотели следовать определенному приложению более тесно, сказать после внесения изменения, мы могли подписаться на канал RSS для того определенного приложения, пока мы не были удовлетворены. Более трудно сделать это от текстового файла.

, Где я в теперь, мы полагаемся намного больше на сторонние инструменты и их способности к входу, и это означает возвращаться к намного большему количеству ручного обзора. Я действительно пропускаю DB, и я рассматриваюсь, пишущий инструмент, чтобы считать те журналы и повторно зарегистрировать их в DB для возвращения этих способностей.

Снова, мы сделали это с текстовыми файлами как нейтрализация, и это - новые способности, которые действительно делают базу данных стоящей. Если все, что Вы собираетесь делать, записать в DB и попытку использовать его тот же способ, которым Вы сделали старые текстовые файлы, это добавляет ненужную сложность, и можно также просто использовать старые текстовые файлы. Это - способность пристроить систему для новых возможностей, которая делает его стоящим.

8
задан Tom 7 1 January 2019 в 17:16
поделиться

2 ответа

I cannot imagine any possible way how that typeid could be used to check that type is polymorphic. It cannot even be used to assert that it is, since typeid will work on any type. У Boost есть реализация здесь . Что касается того, почему это может быть необходимо - один из известных мне случаев - это библиотека Boost.Serialization. Если вы сохраняете неполиморфный тип, то можете просто сохранить его. При сохранении полиморфного типа вы должны получить его динамический тип с помощью typeid, а затем вызвать метод сериализации для этого типа (ища его в какой-то таблице).

Обновление : похоже, я действительно ошибаюсь. Рассмотрим этот вариант:

template <class T> 
bool isPolymorphic() { 
    bool answer=false;
    T *t = new T();
    typeid(answer=true,*t); 
    delete t;
    return answer; 
}

Это действительно работает, как следует из названия, точно для каждого комментария в исходном фрагменте кода. Выражение внутри typeid не оценивается, если оно «не обозначает lvalue полиморфного типа класса» (std 3.2 / 2). Итак, в приведенном выше случае, если T не является полиморфным, выражение typeid не вычисляется. Если T полиморфен, то * t действительно является l-значением полиморфного типа, поэтому все выражение должно быть вычислено.

Итак, ваш исходный пример все еще неверен :-). Он использовал T () , а не * t . И T () создать rvalue (std 3.10 / 6). Таким образом, он по-прежнему дает выражение, которое не является «l-значением полиморфного класса».

Это довольно интересный трюк. С другой стороны, его практическая ценность несколько ограничена - потому что, хотя boost :: is_polymorphic дает вам константу времени компиляции, этот дает вам значение времени выполнения, поэтому вы не можете создать экземпляр другого кода для полиморфных и неполиморфных типов. .

8
ответ дан 5 December 2019 в 15:25
поделиться


class PolyBase {
public:   
    virtual ~PolyBase(){}
};

class NPolyBase {
public:
    ~NPolyBase(){}
};

template<class T>
struct IsPolymorphic
{
    struct Derived : T {
        virtual ~Derived();
    };
    enum  { value = sizeof(Derived)==sizeof(T) };
};


void ff()
{
    std::cout << IsPolymorphic<PolyBase >::value << std::endl;
    std::cout << IsPolymorphic<NPolyBase>::value << std::endl;
}

3
ответ дан 5 December 2019 в 15:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: