Prezident USA Donald Trump během svého projevu na valném shromáždění OSN 22. září 2026 prohlásil, že umělá inteligence 'bude dále oficiálně nazývána superinteligencí', zkráceně SI. Svůj návrh zdůvodnil takto: 'Použití slova artificial činí inteligenci falešnou. Ona falešná není, ve skutečnosti je úžasná'. Zároveň ve svém proslovu prohlásil, že Spojené státy kategoricky odmítají jakékoliv pokusy o vytvoření 'globalistického
… více »Čínská technologická firma Xiaomi představila novou verzi 2.6 svého modelu MiMo, váhy modelů MiMo‑V2.6‑Pro‑RL a MiMo‑V2.6‑Flash‑RL jsou dostupné na HuggingFace pod licencí MIT. Výkonnější varianta Pro má přes bilion parametrů, z toho 42 miliard aktivních, úspornější Flash 309 miliard parametrů, z nichž se při generování aktivuje přibližně 15 miliard. Oba modely mají délku kontextového okna milion tokenů. Tyto MoE modely zvládají
… více »Proběhl Snapdragon Summit 2026. Společnost Qualcomm se mimo jiné pochlubila během Linuxu na čipech Snapdragon X2. Zatím pouze v ranní verzi vhodné pro vývojáře linuxových distribucí a přispěvatele do jádra Linux.
Byla vydána nová verze 2.0 klienta F-Droid určeného pro instalaci bezplatných a otevřených mobilních aplikací do Androidu ze softwarového repozitáře F-Droid (Wikipedie). Jedná se o alternativu k Google Play.
Debian Inference Portal nabízí vývojářům Debianu bezplatný přístup ke službám AI/LLM. Sponzorem je společnost Scaleway.
Robert Ressl nalezl ve WordPressu kritickou zranitelnost CVE-2026-87902 s CVSS 9.2. Útočníkům umožňuje neoprávněný přístup k souborům a vzdálené spuštění kódu (RCE). Opravena je ve verzích 7.1.2, 7.0.6, 6.9.9…
Společnost Meta na dvoudenní konferenci Meta Connect 2026 představuje své novinky. Vypíchnout lze lehké brýle s funkci VR Meta VR Glasses. Do prodeje půjdou na jaře 2027 za cenu 1299,99 dolarů.
Google Chrome 154 byl prohlášen za stabilní. Nejnovější stabilní verze 154.0.8037.57 přináší řadu novinek. Podrobný přehled v poznámkách k vydání. Opraveno bylo 108 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře.
Vláda sníží v příštím roce výdaje na IT služby státu o 1,4 miliardy korun. Úspory má umožnit lepší koordinace nákupu služeb napříč resorty prostřednictvím nového zmocněnce. Celkové roční výdaje státu na informační technologie a digitalizaci se podle údajů ministerstva průmyslu a obchodu pohybují okolo 20 až 25 miliard korun ročně, pro letošek bylo na 320 projektů vyčleněno 21 miliard.
Irská komise pro ochranu dat (DPC) uložila americké technologické společnosti Google ze skupiny Alphabet pokutu 403 milionů eur (9,8 miliardy Kč) za neoprávněné nakládání s údaji o poloze uživatelů. Firma podle komise porušila evropské nařízení o ochraně osobních údajů (GDPR). DPC uvedla, že při šetření zjistila, že si lidé nemuseli být vědomi skutečnosti, že jejich poloha byla využívána například k ovlivňování prostřednictvím reklam nebo k odvozování jejich zájmů, a mohli tak ztratit kontrolu nad svými osobními údaji.
Class Data
{
public:
...
std::vector<u8> readU8(Info i);
std::vector<float> readFloat(Info i);
std::vector<std::vector<float>> readFloatVector(Info i);
...
}
Ve třídě Info je hromada informací podle kterých ty data získávám + jejich datový typ uložený jako enum class
enum class DatovyTyp : u8 {U8,Float,FloatVector,...}
class Info
{
public:
...
std::string jmeno;
DatovyTyp typ;
...
}
Celé použití je dost nešikovné, protože když chci získat všechny data a pak je zase dál použít, musím mít IF pro každý datový typ:
(navazující metody už jsou teplate nebo přetížené, takže umí pracovat se všemi datovými typy, které potřebuju)
Data d(...);
for(...)
{
Info i(...);
if(i.typ == DatovyTyp::Float)
{
std::vector<float> tmp = d.readFloat(i);
nějakáPřetíženáFunkceNeboTemplate(tmp,...);
}
else if(i.typ == VariableType::U8)
{
nějakáPřetíženáFunkceNeboTemplate(d.readU8(i),...);
}
}
Použití template ve smyslu:
template <typename T>
T read(Info i)
{
...
mě sice sjednotí všechny readXY do jedné šablony, ale pořád budu muset mít IF pro každý datový typ
if(i.typ == DatovyTyp::Float)
{
std::vector<float> tmp = d.read<float>(i);
nějakáPřetíženáFunkceNeboTemplate(tmp,...);
}
else if(i.typ == VariableType::U8)
{
nějakáPřetíženáFunkceNeboTemplate(d.read<u8>(i),...);
}
Chtěl bych idálně mít nějaký kouzelný template, který vrací datový typ podle toho enum class DatovyTyp - což pokud vím nejde.
Takže se ptám, jestli existuje nějaká možnost jak uložit informaci o datovém typu tak, abych to potom mohl použít k určení návratového datového typu v template? Zatím jsem nic nenašel a co se pamatuju, tak tohle template neumožňují - existuje nějaká možnost jak to obejít?
Nebo jak to celé upravit nějak jinak, abych se vyhnul IF pro každý datový typ?
Díky.
Data získat. To se čistě templaty vyřešit nedá, protože templaty v C++ se řeší pouze při překladu. Nějaké runtimové logice s větvením se tedy nevyhneš. Dá se to ale částečně zjednodušit tím, že logiku, která za běhu zjistí požadovaný datový typ a podle toho zavolá příslušnou obsluhu přesuneš do jedné flexibilní funkce. Nějaký nástin, jak na to můžeš najít třeba tady: https://pastebin.com/XUvcSJUr. Vtip je v tom, že to, co se předává dispatcheru jako templatový parameter P lze naimplemetovat libovolně, zatímco dispatcher bude vždy jen jeden.
Dalo by se to samozřejmě rozšířit i pro případy, že by měl dispatcher něco vracet apod. ale princip by byl stejný...
read():
https://pastebin.com/5GuZk4m5
P, která s budou používat nejčastěji můžeš implementovat ty jako autor rozhraní s tím, že coder monkey prostě zavolá nějaký wrapper okolo dispatcheru a nebude řešit, co se vevnitř děje. std::variant v kódu není nejspíš proto, že je to věcička až z C++17 a starší překladače to nezbaští.
std::get<float>(variant) ... jestli mi teda zase něco neuniklo
std::variant? Tam se to řeší přes visitor patern.
Data data vždy jen jednoho typu nebo zda je možné zavolat d.readFloat() a d.readU8() na jedné instanci té třídy. To by se variantem myslím řešit nedalo. Aspoň trochu flexibilní logika, jak řešit ten druhý případ by mohla vypadat třeba takto:
#include <iostream>
#include <vector>
enum class TypeID {
String,
Float,
Integer
};
template <TypeID>
struct TypeIdentifier {
};
template <>
struct TypeIdentifier<TypeID::String> {
typedef std::string type;
};
template <>
struct TypeIdentifier<TypeID::Float> {
typedef float type;
};
template <>
struct TypeIdentifier<TypeID::Integer> {
typedef int32_t type;
};
struct Data {
template <typename T>
std::vector<T> read();
};
template <>
std::vector<std::string> Data::read()
{
return std::vector<std::string>{ "Zero", "One", "Two" };
}
template <>
std::vector<float> Data::read()
{
return std::vector<float>{ 0.1, 0.2, 0.3 };
}
template <>
std::vector<int32_t> Data::read()
{
return std::vector<int32_t>{ 10, 20, 30 };
}
template <typename T>
void print(const T &t)
{
for (auto && i : t)
std::cout << i << " ";
std::cout << "\n";
}
template <typename T>
void printReverse(const T &t)
{
for (auto it = t.rbegin(); it != t.rend(); it++)
std::cout << *it << " ";
std::cout << "\n";
}
template <template <typename> class P, typename S, typename... Args>
void dispatcher(const TypeID id, S &s, Args... args)
{
switch (id) {
case TypeID::String:
P<TypeIdentifier<TypeID::String>::type>::call(s, std::forward<Args>(args)...); break;
case TypeID::Float:
P<TypeIdentifier<TypeID::Float>::type>::call(s, std::forward<Args>(args)...); break;
case TypeID::Integer:
P<TypeIdentifier<TypeID::Integer>::type>::call(s, std::forward<Args>(args)...); break;
}
}
template <typename T>
struct Proc {
static void call(Data &d)
{
auto v = d.read<T>();
print(v);
}
};
template <>
struct Proc<int32_t> {
static void call(Data &d)
{
std::cout << "Specialization for int32_t\n";
auto v = d.read<int32_t>();
print(v);
}
};
template <typename T>
struct ProcTwo {
template <typename... Args>
static void call(Data &d, Args ...)
{
auto v = d.read<T>();
printReverse(v);
}
};
template <>
struct ProcTwo<float> {
static void call(Data &d, int i)
{
std::cout << "Specialization for float: " << i << "\n";
auto v = d.read<float>();
printReverse(v);
}
template <typename... Args>
static void call(Data &, Args...)
{
throw std::runtime_error("Function called with invalid parameters");
}
};
int main()
{
Data d;
dispatcher<Proc>(TypeID::String, d);
dispatcher<Proc>(TypeID::Float, d);
dispatcher<Proc>(TypeID::Integer, d);
dispatcher<ProcTwo>(TypeID::String, d);
dispatcher<ProcTwo>(TypeID::Float, d, 66);
//dispatcher<ProcTwo>(TypeID::Float, d); /* Throws at runtime */
dispatcher<ProcTwo>(TypeID::Integer, d);
return 0;
}
template<int N, class Head, class... Tail>
struct Dispatch {
static void dispatch(const Info& i, const Data& d) {
if (i.typ == N)
perform<Head>(i, d);
else
Dispatch<N+1, Tail...>::dispatch(i, d);
}
};
Tiskni
Sdílej: