Visual C++ has #pragma message
that outputs a string into compiler output. Now I have a factory:
template<class Type>
CComPtr<Type> CreateComObject()
{
CComPtr<Ty开发者_开发技巧pe> newObject( new CComObject<Type> );
//do some tuning to the object
return newObject;
}
and I want to output the size of class that is passed to new
(namely sizeof( CComObject<Type> )
into the compiler output. Looks like #pragma message
only accepts strings.
How can I output a compile-time numeric constant?
If I understood your question correctly, then I think you can do this:
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;
}
The value of sizeof(CComObject<Type>)
will be printed as warning messages during compilation.
See this small demo : http://www.ideone.com/Diiqy
Look at these messages (from the above link):
prog.cpp: In member function ‘overflow::operator char() [with unsigned int size = 4u]’:
prog.cpp: In member function ‘overflow::operator char() [with unsigned int size = 12u]’:
prog.cpp: In member function ‘overflow::operator char() [with unsigned int size = 400u]’:
In Visual Studio, you can see these messages in the Build Output tab; it may not appear in Error List > Warnings tab.
The idea is taken from my another solution:
Calculating and printing factorial at compile time in C++
精彩评论