Использовать шаблонный параметр в директиве препроцессору?

Действительно ли возможно использовать нетип постоянный шаблонный параметр в директиве препроцессору? Вот то, что я имею в виду:

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. Я предполагаю, что препроцессор ничего действительно не знает о шаблонах, и этот вид вещи просто не находится в ее домене. Что говорит?

7
задан Brian Tompsett - 汤莱恩 14 June 2016 в 09:12
поделиться

2 ответа

Нет, это невозможно. Препроцессор довольно тупой и ничего не знает о структуре вашей программы. Если T :: Doo не определено в препроцессоре (а это невозможно из-за :: ), он не может вычислить это выражение и завершится ошибкой.

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

        if (T::Doo & 0x010) {
            // some code here
        }

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

11
ответ дан 6 December 2019 в 15:19
поделиться

то, какие элементы доступны в T, зависит от того, какие биты установлены в T :: DOO

Мне кажется, что действует T :: DOO как идентификатор подкласса. Поэтому я думаю, что ваш Foo и связанные классы должны быть подклассами класса, который гарантирует, что DOO определен.

Ключ: почему вы должны использовать битовое поле?

2
ответ дан 6 December 2019 в 15:19
поделиться
Другие вопросы по тегам:

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