Кресты / Говнокод #23650 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
#include <typeinfo>
#include <string>
#include <iostream>
using namespace std::literals::string_literals;
using std::cout;

#if defined(__GNUG__) || defined(__clang__)
#include <cxxabi.h>
template <typename T>
std::string get_real_type() {
	int status;
	char *real_name = abi::__cxa_demangle(typeid(T).name(), nullptr, nullptr, &status);
	return (status == 0 ? std::string(real_name) : ("(not demangled)"s + typeid(T).name())); 
}
#else
template <typename T>
std::string get_real_type() {
	return typeid(T).name();
}
#endif

template <typename T>
struct overload_generator {
	std::string get_type_impl() {
		return get_real_type<T>();
	}
};

template <typename... Ts>
struct printer : overload_generator<Ts>...
{
	using overload_generator<Ts>::get_type_impl...;
	template<typename T>
	void println_type() {
		cout << overload_generator<T>::get_type_impl() << '\n';
	}
	template <typename... Us>
	void println_types() {
		println_types_impl((std::string(overload_generator<Us>::get_type_impl()) + "\n")...);
	}
private:
	template <typename... Us>
	void println_types_impl(Us... args) {
		(cout << ... << args);
	}
};

int main() {
	auto pr = printer<int,long,decltype(nullptr)>();
	pr.println_type<long>();
	pr.println_types<long, decltype(nullptr),int>();
}

По мотивам http://govnokod.ru/23638#comment395579
Разманглил имена, а то gcc выдает нечитаемую дичь в type_info::name для типов сложнее инта
Ну и сахар из c++17 вроде свёртки аргументов вариативной шаблонной функции (fold expression, хз как лучше перевести) тут тоже есть

Запостил: eszett eszett, (Updated )

Комментарии (9) RSS

Добавить комментарий

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8