main.cpp 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <tuple>
  4. #include <string>
  5. // Test new headers in cpp17
  6. #include <variant>
  7. #include <optional>
  8. #include <any>
  9. #include <string_view>
  10. // Test for nested namespace definition
  11. namespace PrusaSlicer::Cpp17 {
  12. template<class T> class Foo
  13. {
  14. T m_arg;
  15. public:
  16. explicit Foo(T &&arg): m_arg{arg} {}
  17. };
  18. } // namespace PrusaSlicer::Cpp17
  19. template<class T> std::string get_type(const T &v);
  20. template<> std::string get_type(const int &) { return "int"; }
  21. template<> std::string get_type(const double &) { return "double"; }
  22. template<> std::string get_type(const float &) { return "double"; }
  23. int main()
  24. {
  25. // /////////////////////////////////////////////////////////////////////////
  26. // Template argument deduction for class templates
  27. // /////////////////////////////////////////////////////////////////////////
  28. auto foo = PrusaSlicer::Cpp17::Foo{1.f};
  29. // /////////////////////////////////////////////////////////////////////////
  30. // Structured bindings:
  31. // /////////////////////////////////////////////////////////////////////////
  32. auto my_tuple = std::make_tuple(0.2, 10);
  33. auto [a, b] = my_tuple;
  34. std::cout << "a is " << get_type(a) << std::endl;
  35. std::cout << "b is " << get_type(b) << std::endl;
  36. // /////////////////////////////////////////////////////////////////////////
  37. // Test for std::apply()
  38. // /////////////////////////////////////////////////////////////////////////
  39. auto fun = [] (auto a, auto b) {
  40. std::cout << "a (" << get_type(a) << ") = " << a << std::endl;
  41. std::cout << "b (" << get_type(b) << ") = " << b << std::endl;
  42. };
  43. std::apply(fun, my_tuple);
  44. // /////////////////////////////////////////////////////////////////////////
  45. // constexpr lambda and if
  46. // /////////////////////////////////////////////////////////////////////////
  47. auto isIntegral = [](auto v) constexpr -> bool {
  48. if constexpr (std::is_integral_v<decltype(v)>) {
  49. return true;
  50. } else {
  51. return false;
  52. }
  53. };
  54. static_assert (isIntegral(10), "" );
  55. // would fail to compile: static_assert (isIntegral(10.0), "" );
  56. std::cout << "Integer is integral: " << isIntegral(0) << std::endl;
  57. std::cout << "Floating point is not integral: " << isIntegral(0.0) << std::endl;
  58. return EXIT_SUCCESS;
  59. }