Отключите метод класса во время компиляции, если значение шаблона можно преобразовать в bool - PullRequest
0 голосов
/ 10 февраля 2019

Я хочу отключить метод no-arg в этом классе, если тип T, содержащийся в классе, может быть приведен к типу bool.

Я пробовал некоторые вещи SFINAE сenable_if, однако я столкнулся с множеством проблем при этом.Возможно ли то, что я хочу?

template <typename T>
struct Watch {
    T t;

    // Enable if and only if bool(t) can be performed
    void stop() {
        // ...
    }

    void stop(int secondsFromNow) {
        // ...
    }
};

int main() {
    Watch<int> watch;
    watch.stop();
    watch.stop(5);

    Watch<string> watchStr;
    //watchStr.stop();
    watchStr.stop(2);
}

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

Какможно сделать вызов stop() для Watch с элементом, который не преобразуется в логический сбой во время компиляции, если кто-то попытается вызвать его, не затрагивая другие методы?

1 Ответ

0 голосов
/ 10 февраля 2019

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

template <typename U = T, typename = std::enable_if_t<std::is_convertible_v<U, bool>>>
void stop();

Здесь попытка вычислить тип enable_if не произойдет, пока не будет вызвана stop иU дано значение, поэтому SFINAE начинает работу.

В некоторых случаях вы можете просто захотеть, чтобы функция вообще не объявлялась, когда условие времени компиляции не выполняется.Вы можете сделать это, унаследовав от базового класса CRTP, который либо содержит, либо не содержит данную функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...