2010-06-24 2 views
19

Boost имеет как enable_if, так и disable_if, но C++ 0x, похоже, отсутствует. Почему это было исключено? Существуют ли метапрограммы в C++ 0x, которые позволяют мне строить disable_if с точки зрения enable_if?Где disable_if в C++ 0x?


О, я только что заметил, что std::enable_if в основном boost::enable_if_c, и что не существует такого понятия, как boost::enable_if в C++ 0x.

ответ

16

Рискуя прослыть глупым, просто сделай !expression вместо expression в параметре шаблона BOOL в enable_if, чтобы сделать его вести себя как disable_if? Конечно, если эта идея работает, вы можете просто расширить ее, чтобы написать класс с поведением disable_if?

Хорошо, я полагаю, вы могли бы реализовать disable_if так:

template <bool B, typename T = void> 
struct disable_if { 
    typedef T type; 
}; 

template <typename T> 
struct disable_if<true,T> { 
}; 
+5

Да, я только что понял, 'enable_if' принимает' bool' вместо типа, поэтому отрицая условие тривиально. Тем не менее, это сделает код более читаемым, чтобы иметь 'disable_if'. – fredoverflow

+0

Хорошо, я дал написание disable_if выстрела, в то время как я считаю, что это правильно, мои способности метапрограммирования немного отстают. – Jacob

+0

Выглядит хорошо для меня (за исключением отсутствующей точки с запятой после 'typedef' в строке 3). Я бы, вероятно, изменил логику, т. Е. Создал пустую общую 'struct', а затем специализировал ее на' false', но это всего лишь вопрос мнения/стиля, а не корректности :) – fredoverflow

Смежные вопросы