, Удаление теста будет выполнено оптимизатором, который концептуально запускается после того, как компилятор выяснил, что в первую очередь означает код.

template <bool flag>
class foo
{
    public:
        int bar()
        {
            if(flag)
            {
                // stuff
            }
        }
};

компилятор компилирует этот класс, он заменяет параметр флага на true или false. Тогда имеем if (true) (или if (false)). Затем предложение if проверяет постоянное выражение и будет удалено во время компиляции. Можно ли ожидать, что компиляторы будут вести себя так?

 Nim30 мая 2011 г., 11:56
почему бы вам не предоставить специализацию дляfalse который ничего не делает?

Ответы на вопрос(3)

Обратите внимание, что вы не можете создать экземпляр шаблона сfalse если вы пишете код внутриif заявление, которое не компилируется, когдаflag являетсяfalse, Удаление теста будет выполнено оптимизатором, который концептуально запускается после того, как компилятор выяснил, что в первую очередь означает код.

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

Решение Вопроса

лиза и не выполнить пошаговую разборку?

Тем не менее, это не идиоматический способ сделать это. Вы должны либо использовать специализацию шаблона, либо перегрузку метода. Они оба обеспечивают разрешение во время компиляции. Итак, в этом случае я бы предпочел последнее:

#include <type_traits>
template <bool flag>
class foo
{
public:
    int bar()
    {
        _bar(std::integral_constant<bool, flag>())
    }
private:
    int _bar(std::true_type)
    {
        // stuff
    }
    int _bar(std::false_type)
    {
        // empty
    }
};

РЕДАКТИРОВАТЬ: для этого требуется C ++ 0x, но его можно легко перевести на C ++ 98, включивboost/type_traits и меняетсяstd:: директивы кboost::, И, конечно же, это потребует повышения библиотек.

 DyingSoul30 мая 2011 г., 14:38
У меня проблемы с этим. Теперь у меня два звонка вместо одного звонка. Разве это не намного медленнее, чем предложение if?
 Björn Pollex30 мая 2011 г., 12:13
Это C ++ 0x. Вы должны упомянуть, что если ОП не сказал, что ищет решение C ++ 0x, и вопрос не помечен как C ++ 0x.
 gwiazdorrr30 мая 2011 г., 12:27
Спасибо за указание на это. Я только что добавил комментарий, который касается этого.
 gwiazdorrr30 мая 2011 г., 16:09
Ах, хорошая мысль.bar должен быть определен какinline - это совет для компилятора "копировать-задавать" точный код функции вместо его вызова. Еще раз мы должны рассчитывать на компилятор, чтобы сделать работу, но, на мой взгляд, это решение гораздо более идиоматично. Например, STL или Boost оба используют этот вид разрешения времени компиляции с большим успехом. Другое решение, которое я указал, например, специализация шаблона класса избавит от «лишнего» вызова, но это может привести к неприятному дублированию кода и проводной иерархии.

Ваш ответ на вопрос