Я действительно запутался в следующем фрагменте кода C++:
// The global task manager
PT(AsyncTaskManager) taskMgr = AsyncTaskManager::get_global_ptr();
// The global clock
PT(ClockObject) globalClock = ClockObject::get_global_clock();
Есть ли "PT" имя типа? И почему после этого есть скобки? Я никогда не видел такого синтаксиса в C++ (может быть, я должен снова прочитать некоторые C++ учебники?)
Мой второй хит Google для "c++ AsyncTaskManager" (первый - ваш вопрос здесь):
http://www.panda3d.org/forums/viewtopic.php?t=5115
Это, в свою очередь, приводит к http://www.panda3d.org/, где говорится:
Panda3D - это игровой движок, каркас для 3D-рендеринга и разработки игр для программ Python и c++.
Таким образом, вы, по-видимому, имеете дело с куском кода, связанным с этим движком (о котором я раньше не слышал). Просмотр документации в Интернете не позволяет быстро определить какое-либо определение для PT
, но если вы загрузите исходный код и просто выполните поиск по всем файлам для "#define PT", voilà:
Файл pointerTo.h
, начиная с строки 166:
// Finally, we'll define a couple of handy abbreviations to save on
// all that wasted typing time.
#define PT(type) PointerTo< type >
Если вы продолжите исследование, вы увидите, что PointerTo
на самом деле довольно сложный класс шаблонов, задокументированный как:
PointerTo - это класс шаблонов, который реализует интеллектуальный указатель на объект, полученный из ReferenceCount.
Таким образом, PT(AsyncTaskManager) taskMgr = AsyncTaskManager::get_global_ptr();
действительно:
PointerTo<AsyncTaskManager> taskMgr = AsyncTaskManager::get_global_ptr();
Если я так скажу, я думаю, что все "потраченное время печатания", предположительно сэкономленное макросом, легко расходуется на все время чтения и исследования, необходимое для понимания кода. Об этом свидетельствует весь этот вопрос и все комментарии и ответы.
Это для сохранения усилий при наборе текста. Гораздо проще набрать PT(AsyncTaskManager)
чем AsyncTaskManager*
. Вы также можете делать такие вещи, как:
#define BEGIN {
#define END }
AsyncTaskManager*
даже на три символа меньше.
#define IF(x) if(x)
.
#define PT(x) x*
для меня.