Как вывести числовую константу времени компиляции во время компиляции в Visual C++?

Visual C++ имеет #pragma message что выводит строку в вывод компилятора. Теперь у меня есть фабрика:

template<class Type>
CComPtr<Type> CreateComObject()
{
   CComPtr<Type> newObject( new CComObject<Type> );
   //do some tuning to the object
   return newObject;
}

и я хочу вывести размер класса, который передается в new (а именно sizeof( CComObject<Type> ) В вывод компилятора. Похоже на #pragma message принимает только строки.

как я могу вывести числовую константу времени компиляции?

1 ответов


Если я правильно понял ваш вопрос, то, я думаю, можно сделать так:

template<size_t size> 
struct overflow{ operator char() { return size + 256; } }; //always overflow
//if you doubt, you can use UCHAR_MAX +1 instead of 256, to ensure overflow.

template<class Type>
CComPtr<Type> CreateComObject()
{
   CComPtr<Type> newObject( new CComObject<Type> );
   char(overflow<sizeof(CComObject<Type>)>());
   return newObject;
}

значение sizeof(CComObject<Type>) будет печататься как предупреждающие сообщения во время компиляции.


см. эту небольшую демонстрацию:http://www.ideone.com/Diiqy

посмотрите на эти сообщения (из приведенной выше ссылки):

prog.cpp: в функции-члене 'overflow:: оператор char () [с unsigned int размер = 4u]’:
еда.ЧГК: в функция-член 'overflow:: оператор char () [с unsigned int размер = 12u]’:
еда.СРР: В функции-члене 'overflow:: оператор char () [с unsigned int размер = 400u]’:

в Visual Studio, вы можете увидеть эти сообщения в Вывод tab; он может не отображаться в Список Ошибок > Предупреждения tab.


идея взята из моего другого решение:

расчет и печать факториала во время компиляции в C++