Size: a a a

2020 July 23

NM

Nigga Melon in supapro.cxx
Переслано от Внапанчмен
источник

NM

Nigga Melon in supapro.cxx
Переслано от Внапанчмен
я вызваю метод playSound но музыка не играет
источник

Д

Дмитрий in supapro.cxx
Привет всем ещё раз)) Можно ли как-то сделать мапу, в которой ключ был бы int, а значение некий тип, который я мог бы потом вытащить?
Например:
pair p{1, Type<int>}
 ->
p.second()::type
источник

Д

Дмитрий in supapro.cxx
Важная деталь, что типы разные
источник

АК

Александр Караев... in supapro.cxx
Дмитрий
Привет всем ещё раз)) Можно ли как-то сделать мапу, в которой ключ был бы int, а значение некий тип, который я мог бы потом вытащить?
Например:
pair p{1, Type<int>}
 ->
p.second()::type
template <class T>
struct Type {};


std::pair<int, Type<int>>{ 1, {} }, но тип каждой пары будет разным в зависимости от Type<T>
источник

АК

Александр Караев... in supapro.cxx
в C++ нет динамической типизации
источник

АК

Александр Караев... in supapro.cxx
Дмитрий
Привет всем ещё раз)) Можно ли как-то сделать мапу, в которой ключ был бы int, а значение некий тип, который я мог бы потом вытащить?
Например:
pair p{1, Type<int>}
 ->
p.second()::type
а вообще, такой "динамический" Type реализуется через засовывание в std::function<void()> логики, которую необходимо сделать с конкретным типом позднее (type erasure)
источник

AS

Anatoly Shirokov in supapro.cxx
Дмитрий
Привет всем ещё раз)) Можно ли как-то сделать мапу, в которой ключ был бы int, а значение некий тип, который я мог бы потом вытащить?
Например:
pair p{1, Type<int>}
 ->
p.second()::type
#include <any>
#include <iostream>
#include <map>
#include <string>

int main() {
   std::map<int, std::any> m;    
   m[1] = std::string("hello");
   m[2] = 10.0;
   m[3] = 20;
   
   std::cout << std::any_cast<std::string>(m[1]);
   std::cout << std::any_cast<double>(m[2]);
   std::cout << std::any_cast<int>(m[3]);
}
источник

AS

Anatoly Shirokov in supapro.cxx
и читай про std::any
источник

AS

Anatoly Shirokov in supapro.cxx
если ты имеешь дело с фиксированным набором типов, то вместо std::any используй std::variant
источник

Д

Дмитрий in supapro.cxx
Задача в том, что есть некая функция, которая с помощью шаблона принимает тип, а потом кастит данные к нему. Прикол в том, что сам тип данных неизвестен, но есть их  индификатор. Допустим, есть enum с переменной INT = 1. Я знаю по индификатору, что лежит в моих данных, мне остается их прикастовать. И я хотел создать некую мапу, где ключом будет enum, а значение тип
источник

Д

Дмитрий in supapro.cxx
Но видимо, это все же невозможно
источник

AS

Anatoly Shirokov in supapro.cxx
Дмитрий
Задача в том, что есть некая функция, которая с помощью шаблона принимает тип, а потом кастит данные к нему. Прикол в том, что сам тип данных неизвестен, но есть их  индификатор. Допустим, есть enum с переменной INT = 1. Я знаю по индификатору, что лежит в моих данных, мне остается их прикастовать. И я хотел создать некую мапу, где ключом будет enum, а значение тип
а прикастовать к чему? std::any - очень похоже делает, это type erasure над произвольным типом, как std::function для функций, это для данных
источник

ip

illya palkin in supapro.cxx
Дмитрий
Задача в том, что есть некая функция, которая с помощью шаблона принимает тип, а потом кастит данные к нему. Прикол в том, что сам тип данных неизвестен, но есть их  индификатор. Допустим, есть enum с переменной INT = 1. Я знаю по индификатору, что лежит в моих данных, мне остается их прикастовать. И я хотел создать некую мапу, где ключом будет enum, а значение тип
Ты пишешь что-то типо name_cast() ?
источник

ip

illya palkin in supapro.cxx
Если да, то вот что-то похожее я писал когда-то

template <Scale To, Scale From>
struct ConversionTraits {
   static temperature_t convert(const temperature_t value) = delete;
};

template <>
struct ConversionTraits<Scale::kCelsius, Scale::kFahrenheit> {
   static temperature_t convert(const temperature_t value) {
       return value * 9 / 5 + 32;
   }
};

template <>
struct ConversionTraits<Scale::kFahrenheit, Scale::kCelsius> {
   static temperature_t convert(const temperature_t value) {
       return (value - 32) * 5 / 9;
   }
};

template <Scale To, Scale From>
constexpr Quantity<To> temperature_cast(const Quantity<From>& t) {
   return Quantity<To>(ConversionTraits<From, To>::convert(static_cast<temperature_t>(t)));
}
источник

Д

Дмитрий in supapro.cxx
Anatoly Shirokov
а прикастовать к чему? std::any - очень похоже делает, это type erasure над произвольным типом, как std::function для функций, это для данных
Да, как в std::any_cast. Только в том примере я явно указываю тип, а я хотел бы получать этот тип с попощью некого другого значения. std::any_cast<list_types(INT)::type>(m[1]); Типа такого
источник

Д

Дмитрий in supapro.cxx
illya palkin
Ты пишешь что-то типо name_cast() ?
Не, я просто не хотел писать switch(value) case INT: storage.get_value<int>()
источник

Д

Дмитрий in supapro.cxx
Дмитрий
Не, я просто не хотел писать switch(value) case INT: storage.get_value<int>()
хотя, может это так и называется)
источник

AS

Anatoly Shirokov in supapro.cxx
Дмитрий
Не, я просто не хотел писать switch(value) case INT: storage.get_value<int>()
если значение value известно будет только в рантайме, то никакой шаблонной магии не выйдет.
источник

AS

Anatoly Shirokov in supapro.cxx
одно дело
cast<INT>(storage)
и другое дело void func(int type) {..,..}
источник