Я собираюсь начать с того, как я представляю себе использование кода, который хочу создать. Это не обязательно должно быть именно так, но это хороший пример того, что я имею в виду под «кратким» в названии. В моем случае это сопоставление типа со связанным значением перечисления.
struct bar : foo<bar, foo_type::bar> { /* ... */ };
// \_/ \___________/
// ^ Type ^ Value
В идеале это должно происходить автоматически c регистрацию двунаправленного сопоставления между первым параметром шаблона foo
, type, а во-вторых, значение, только с синтаксисом наследования и правильными параметрами шаблона, чтобы позже я мог делать то, что в примере ниже.
foo_type value = to_value<bar>; // Should be foo_type::bar
using type = to_type<foo_type::bar>; // Should be bar
Я знаю, что могу вручную написать две специализации шаблона для каждого типа -value пара, чтобы сделать это, но мне интересно, может ли это быть менее утомительным, чем это без использования макросов.
Я уже пробовал ...
- Специализация псевдонимов шаблонов для пишите меньше кода для создания специализаций. По-видимому, это невозможно в текущей версии C ++ (17/20).
- Специализация унаследованных типов элементов шаблона.
struct foo_base
{
template<typename T>
struct to_value
{};
template<foo_type E>
struct to_type
{};
};
template<typename T, foo_type E>
struct foo : public foo_base
{
template<>
struct to_value<T>
{
static constexpr auto value = E;
};
template<>
struct to_type<E>
{
using type = T;
};
};
Затем он будет использоваться аналогично тому, что я представил на начало.
foo_type value = foo_base::to_value<bar>::value; // Should be foo_type::bar
using type = foo_base::to_type<foo_type::bar>::type; // Should be bar
Но это не удается с ошибками ниже на MSV C.
явная специализация; 'foo_base :: to_value' уже создан
'foo_base :: to_value': не может специализировать шаблон в текущей области
Я чувствую, что это может быть невозможно без явных ручных специализаций , но C ++ 17 допускает множество неожиданных хаков на основе шаблонов, поэтому хочу подтвердить это у более опытных людей, прежде чем я откажусь от этой идеи.