Wahrscheinlich bin ich nicht die erste Person, die herausfindet, dass std::exception_ptr
verwendet werden könnte, um einen any
Typ zu implementieren (Leistungsaspekte beiseite gelegt), da es wahrscheinlich der einzige Typ in C++ ist halte etwas. Googeln brachte jedoch kein Ergebnis in diese Richtung.std :: any von std :: exception_ptr
Weiß jemand, ob der folgende Ansatz irgendwo für etwas Nützliches verwendet wurde?
#include <exception>
#include <iostream>
struct WrongTypeError : std::exception { };
class Any {
public:
template <class T>
void set (T t) {
try { throw t; }
catch (...) { m_contained = std::current_exception(); }
}
template <class T>
T const & get() {
try { std::rethrow_exception (m_contained); }
catch (T const & t) { return t; }
catch (...) { throw WrongTypeError {}; }
}
private:
std::exception_ptr m_contained = nullptr;
};
int main() {
auto a = Any {};
a.set (7);
std::cout << a.get<int>() << std::endl;
a.set (std::string {"Wonderful weather today"});
std::cout << a.get<std::string>() << std::endl;
return 0;
}
Ich habe den Code bearbeitet. Ich denke, es schneidet nicht mehr. – JohnB
g ++ 4.8.4 hat keine Probleme, zehn Millionen 'Any's zu erzeugen und sie in einem' Vektor' zu speichern. Es ist jedoch schrecklich langsam. (30 Sekunden für das Setzen und Erhalten dieser 10 Millionen Werte.) – JohnB
Eigentlich dachte ich immer, dass ein besserer Trick (seit es seit C++ 98 verfügbar ist) wäre, 'std :: locale' zu verwenden, was immer du willst als eine Facette. –