как определить атомарные типы с помощью enable_if

#c

Вопрос:

Можно ли обнаружить, что мой атомарный тип обнаруживается, если тип является атомарным, используя enable_if ?

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

есть ли в любом случае, чтобы отличить его как атомарный тип

Комментарии:

1. что именно вы имеете в виду под «является атомарным типом» ? Почему вы используете std::is_class ?

2. Вы можете проверить, является ли тип специализацией std::atomic<T> для некоторых T . Это то, чего ты хочешь?

3. Если вы хотите взять только a std::atomic , рассмотрите возможность использования template<typename T> void set(String v, std::atomic<T> amp;value)

Ответ №1:

Вам даже не нужна enable_if в этом случае специализация, достаточно:

 // By default, types are not atomic,
template<typename T> auto constexpr is_atomic = false;

// but std::atomic<T> types are,
template<typename T> auto constexpr is_atomic<std::atomic<T>> = true;

// as well as std::atomic_flag.
template<> auto constexpr is_atomic<std::atomic_flag> = true;

// Tests:
static_assert(!is_atomic<int>);
static_assert(is_atomic<std::atomic<int>>);
static_assert(is_atomic<std::atomic_flag>);
 

Если вы хотите разветвить свою логику времени компиляции на основе этого атрибута, вы можете использовать C 17 if constexpr :

 template<typename T> auto foo(Tamp; t) {
    if constexpr (is_atomic<T>) /* T is atomic */;
    else /* T is not atomic */;
}