Давайте посмотрим на такой код:
// 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
?
@VTT Я только что попытался сделать быструю функцию, сравнивающую dword и возвращающую typedef или typename (например, int), чтобы увидеть, возможно ли это, но похоже, что GCC это не очень нравится ^^
Почему бы не использовать GetValue<int>
? Зачем нужен уровень косвенности? Каковы ограничения?
@Evg Я просто пытаюсь узнать, можно ли сделать что-то подобное.
Если GetValueTypeNo
можно пометить как constexpr
, то это определенно возможно.
Вы можете использовать ключевое слово decltype
:
dword t = GetValueTypeNo<int>();
int test5 = myVector.GetValue<decltype(t)>("test5");
Но здесь параметр шаблона GetValue
будет dword вместо int.
Использование decltype
в этом контексте разрушает точку, потому что специализация шаблона не будет выбрана на основе типа №.
Если 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");
Спасибо за пример, он определенно отвечает на мой вопрос
Вы определенно можете реализовать шаблон функции
GetValueTypeNo
с каждой специализацией, возвращающей какой-либо идентификатор и другой метод шаблонаGetValue
, используя этот идентификатор без каких-либо проблем.