Как к typeof в C++

Здесь [приблизительно 112] ресурсы при реализации IHttpModule для прерывания веб-запросов к приложению...

Пишут/адаптируют для проверки на тип файла (например, псевдокод: если (концы запроса с ".css")...)

тогда используют регулярное выражение для замены всех экземпляров "~ /" с Системой. Сеть. VirtualPathUtility. ToAbsolute (" ~ / ")

я не знаю то, что это сделает к производительности, выполнение каждого запроса через это своего рода фильтрует, но можно, вероятно, играть с web.config файлом, и/или маршруты URL MVC для направления всех запросов .css через это своего рода фильтруют при пропуске мимо него для других файлов.

Задумываются о нем, можно, вероятно, достигнуть того же эффекта в приложении MVC ASP.NET путем указания на все ссылки CSS на специальный controller.action, который выполняет этот вид предварительной обработки для Вас. я сомневаюсь, что это было бы столь же производительно как IHttpModule все же.

5
задан Velho Kerho 8 October 2009 в 20:17
поделиться

7 ответов

Вы можете использовать dynamic_cast для проверки типов, как показано ниже:

IPlugin* iPluginPtr = NULL;
iPluginPtr = dynamic_cast<IPlugin*>(somePluginPtr);

if (iPluginPtr) {
    // Cast succeeded
} else {
    // Cast failed
}
7
ответ дан 18 December 2019 в 07:55
поделиться

Это поведение называется RTTI (информация о типе времени выполнения) . Этого метода лучше избегать, но в некоторых ситуациях он может оказаться полезным.

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

Затем в производных классах вы можете переопределить метод и вернуть тип, специфичный для этого класса. Затем во время выполнения вы можете вызвать, например, Plugin-> getType (), и он вернет свой конкретный тип. Затем вы можете выполнить static_cast для указателя, чтобы получить обратно правильный указатель производного типа.

Второй способ - либо использовать typeid для получения classtype объекта; но это зависит от компилятора. Вы также можете попробовать преобразовать указатель с помощью dynamic_cast; dynamic_cast возвращает нулевой указатель, когда он приводится к неправильному типу; и действительный при приведении в правильный тип. Метод динамического приведения имеет большие накладные расходы, чем метод getType, описанный выше.

5
ответ дан 18 December 2019 в 07:55
поделиться

Если вам нужно полное поведение, подобное typeof, вы должны использовать RTTI (информация о типе времени выполнения) . Во многих компиляторах вам необходимо явно активировать использование RTTI, так как это влечет за собой накладные расходы во время выполнения.

Затем вы можете использовать typeid или dynamic_cast , чтобы найти тип объекта.

] Если вы не хотите использовать typeid, вам придется использовать наследование, указатели и / или перегрузки. Boost может вам помочь, но это не так уж сложно.

Пример 1:

class Iplugin { ... }

class Plugin1 : public Iplugin { ... }
class Plugin2 : public Iplugin { ... }

void getplugins(Iplugin* p) {
    // ... you don't know the type, but you know
    // what operations it supports via Iplugin
}

void getplugins(Plugin1& p) {
    // expliticly handle Plugin1 objects
}

Как видите, есть несколько способов избежать использования RTTI и typeid.

2
ответ дан 18 December 2019 в 07:55
поделиться

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

Всегда старайтесь избегать использования dynamic_cast как такового. чаще всего используется сравнение строк для определения типа объекта, что делает его очень медленным.

2
ответ дан 18 December 2019 в 07:55
поделиться

Вы можете использовать typeof () в GCC. В других компиляторах это либо не поддерживается, либо вам придется делать сумасшедшие искажения шаблонов или использовать «функции ошибок», которые очень специфичны для компилятора (например, как это делает Boost).

2
ответ дан 18 December 2019 в 07:55
поделиться

У Boost есть typeof. C ++ 0x не называет это typeof, но имеет как 'auto', так и 'decltype', которые предоставляют одинаковые функции.

Тем не менее, я почти уверен, что ни один из них не предоставляет то, что вы действительно ищете. в этом случае - в лучшем случае, они предоставляют лишь небольшую часть того, что вам нужно / нужно в целом.

1
ответ дан 18 December 2019 в 07:55
поделиться

Я не отвечаю прямо на вопрос «как получить typeof () в C ++», но из вашего вопроса я делаю вывод, что вы изучаете, как создавать плагины на C ++. В этом случае вас может заинтересовать (пока еще нет) библиотека Boost.Extension и, возможно, ее часть отражение .

0
ответ дан 18 December 2019 в 07:55
поделиться
Другие вопросы по тегам:

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