Сообщение Re[25]: Как записать такое в современном C++? от 01.08.2024 13:18
Изменено 01.08.2024 13:22 kov_serg
Re[25]: Как записать такое в современном C++?
Здравствуйте, so5team, Вы писали:
S>В случае простых enum-ов оно не работает для типов, отличных от int.
S>В случае enum class оно не работает для типов, отличных от целочисленных, да еще и требует указывать дополнительный скоуп.
S>В общем, оно не работает. А я опять вляпался в известную субстанцию в попытках объяснить персонажам вроде вас очевидные вещи
Всё работает просто вы не так используете. В C++ принято всё через жопу делать
S>В случае простых enum-ов оно не работает для типов, отличных от int.
S>В случае enum class оно не работает для типов, отличных от целочисленных, да еще и требует указывать дополнительный скоуп.
S>В общем, оно не работает. А я опять вляпался в известную субстанцию в попытках объяснить персонажам вроде вас очевидные вещи
Всё работает просто вы не так используете. В C++ принято всё через жопу делать
#include <iostream>
using namespace std;
enum E {
name1,
name2,
name3
};
template<enum E e>const char* Es();
template<>const char* Es<name1>() { return "name1"; }
template<>const char* Es<name2>() { return "name2"; }
template<>const char* Es<name3>() { return "name3"; }
template<enum E e>double Ed();
template<>double Ed<name1>() { return 1; }
template<>double Ed<name2>() { return 0.5; }
template<>double Ed<name3>() { return 3.14; }
template<enum E e>struct Eb;
template<>struct Eb<name1> {
template<class T>
static void run(T t) { t(); }
};
template<>struct Eb<name2> {
template<class T>
static void run(T t) { try { t(); } catch(...) {} }
};
template<>struct Eb<name3> {
template<class T>
static void run(T t) { try { t(); } catch(...) { cerr<<"ups\n"; } }
};
int main(int argc, char const *argv[]) {
cout<<(Es<name1>())<<" "<<(Ed<name3>())<<endl; // тут не целые константы
Eb<name3>::run([]{ throw 0; }); // тут алгоритм
return 0;
}Re[25]: Как записать такое в современном C++?
Здравствуйте, so5team, Вы писали:
S>В случае простых enum-ов оно не работает для типов, отличных от int.
S>В случае enum class оно не работает для типов, отличных от целочисленных, да еще и требует указывать дополнительный скоуп.
S>В общем, оно не работает. А я опять вляпался в известную субстанцию в попытках объяснить персонажам вроде вас очевидные вещи
Всё работает просто вы не так используете. В C++ принято всё через жопу делать
S>В случае простых enum-ов оно не работает для типов, отличных от int.
S>В случае enum class оно не работает для типов, отличных от целочисленных, да еще и требует указывать дополнительный скоуп.
S>В общем, оно не работает. А я опять вляпался в известную субстанцию в попытках объяснить персонажам вроде вас очевидные вещи
Всё работает просто вы не так используете. В C++ принято всё через жопу делать
#include <iostream>
using namespace std;
enum E {
name1,
name2,
name3
};
template<enum E e>const char* Es();
template<>const char* Es<name1>() { return "name1"; }
template<>const char* Es<name2>() { return "name2"; }
template<>const char* Es<name3>() { return "name3"; }
template<enum E e>double Ed();
template<>double Ed<name1>() { return 1; }
template<>double Ed<name2>() { return 0.5; }
template<>double Ed<name3>() { return 3.14; }
template<enum E e>bool Eс();
template<>bool Eс<name1>() { return true; }
template<>bool Eс<name2>() { return false; }
template<>bool Eс<name3>() { return false; }
static bool E_is_critical(enum E e) {
switch(e) {
case name1: return Eс<name1>();
case name2: return Eс<name2>();
case name3: return Eс<name3>();
}
throw;
}
template<enum E e>struct Eb;
template<>struct Eb<name1> {
template<class T>
static void run(T t) { t(); }
};
template<>struct Eb<name2> {
template<class T>
static void run(T t) { try { t(); } catch(...) {} }
};
template<>struct Eb<name3> {
template<class T>
static void run(T t) { try { t(); } catch(...) { cerr<<"ups\n"; } }
};
int main(int argc, char const *argv[]) {
cout<<(Es<name1>())<<" "<<(Ed<name3>())<<endl;
Eb<name3>::run([]{ throw 0; });
return E_is_critical(name2);
}