TransWikia.com

Использование ограничения шаблона SFINAE при полной специализации

Stack Overflow на русском Asked by mkkik on January 12, 2021

Необходимо получать некий идентификатор для типа, сделано через полную специализацию шаблона.

template<typename T> struct ids;
template<> struct ids<int> { static const int id = 1; };
template<> struct ids<float> { static const int id = 2; };

Возможно ли аналогично специализировать шаблон для любого типа, проходящего ограничение std::is_class?
Не совсем представляю, как это правильно сделать. Думал, что это должно выглядеть примерно так:

template<typename T, typename = typename std::enable_if<std::is_class<A>::value>>
struct ids { static const int id = 3 };

One Answer

#include <type_traits>

template<typename x_Value, typename x_Enabled = void>
struct ids;

template<>
struct ids<int, void>
{ static inline constexpr int const id{1}; };

template<>
struct ids<float, void>
{ static inline constexpr int const id{2}; };

template<typename x_Value>
struct ids<x_Value, ::std::enable_if_t<::std::is_class_v<x_Value>>>
{ static inline constexpr int const id{3}; };

static_assert(1 == ids<int>::id);
static_assert(2 == ids<float>::id);

struct something{};

static_assert(3 == ids<something>::id);

https://godbolt.org/z/6ax86d

Correct answer by user7860670 on January 12, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP