Действительно ли возможно использовать нетип постоянный шаблонный параметр в директиве препроцессору? Вот то, что я имею в виду:
template <int DING>
struct Foo
{
enum { DOO = DING };
};
template <typename T>
struct Blah
{
void DoIt()
{
#if (T::DOO & 0x010)
// some code here
#endif
}
};
Когда я пробую это чем-то как Blah<Foo<0xFFFF>>
, VC ++ 2010 жалуется что-то на несопоставленные круглые скобки в строке, где мы пытаемся использовать #if
. Я предполагаю, что препроцессор ничего действительно не знает о шаблонах, и этот вид вещи просто не находится в ее домене. Что говорит?
Нет, это невозможно. Препроцессор довольно тупой и ничего не знает о структуре вашей программы. Если T :: Doo
не определено в препроцессоре (а это невозможно из-за ::
), он не может вычислить это выражение и завершится ошибкой.
Однако вы можете положиться на компилятор, который сделает все за вас:
if (T::Doo & 0x010) {
// some code here
}
Постоянные выражения и мертвые ветви оптимизируются даже при более низких настройках оптимизации, так что вы можете безопасно делать это без каких-либо дополнительных затрат времени выполнения.
то, какие элементы доступны в T, зависит от того, какие биты установлены в
T :: DOO
Мне кажется, что действует T :: DOO
как идентификатор подкласса. Поэтому я думаю, что ваш Foo
и связанные классы должны быть подклассами класса, который гарантирует, что DOO
определен.
Ключ: почему вы должны использовать битовое поле?