#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 */;
}