Можно ли преобразовать Dword в Type Name?

Давайте посмотрим на такой код:

// Return me Dword of int
dword t = GetValueTypeNo<int>();
//here trying to tell to GetValue that my template is int (since t is dword of int)
int test5 = myVector.GetValue<t>("test5");

Конечно, такой код не работает и фактически бесполезен. Но можно ли сделать что-то подобное? применить dword к названию типа, например int?

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

user7860670 28.05.2019 09:44

@VTT Я только что попытался сделать быструю функцию, сравнивающую dword и возвращающую typedef или typename (например, int), чтобы увидеть, возможно ли это, но похоже, что GCC это не очень нравится ^^

Xemuth 28.05.2019 09:50

Почему бы не использовать GetValue<int>? Зачем нужен уровень косвенности? Каковы ограничения?

Evg 28.05.2019 09:50

@Evg Я просто пытаюсь узнать, можно ли сделать что-то подобное.

Xemuth 28.05.2019 09:54

Если GetValueTypeNo можно пометить как constexpr, то это определенно возможно.

Evg 28.05.2019 09:56
«GCC это не очень нравится» не является описанием проблемы
user7860670 28.05.2019 09:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
6
107
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать ключевое слово decltype:

dword t = GetValueTypeNo<int>();
int test5 = myVector.GetValue<decltype(t)>("test5");

Но здесь параметр шаблона GetValue будет dword вместо int.

Использование decltype в этом контексте разрушает точку, потому что специализация шаблона не будет выбрана на основе типа №.

user7860670 28.05.2019 09:43
Ответ принят как подходящий

Если GetValueTypeNo можно сделать функцией constexpr, вы можете сделать что-то вроде этого:

template<typename T>
constexpr dword GetValueTypeNo() { ... }

template<dword>
struct Type_selector;

template<>
struct Type_selector<dword_value_for_int> {
    using Type = int;
};

template<>
struct Type_selector<dword_value_for_long> {
    using Type = long;
};

...

template<dword type>
using Type = typename Type_selector<type>::Type;

а затем напишите:

template<dword type>
Type<type> GetValue(...)
{ ... }

constexpr dword t = GetValueTypeNo<int>();
int test5 = myVector.GetValue<t>("test5");

Спасибо за пример, он определенно отвечает на мой вопрос

Xemuth 28.05.2019 10:17

Другие вопросы по теме