{"pageProps":{"code":{"CMakeLists.txt":{"name":"CMakeLists.txt","content":"add_executable(class-template-start-main class-template-start-main.cpp)\n\nadd_executable(default-members default-members.cpp)\n\nadd_executable(friend friend.cpp)\n\nadd_executable(function-templates function-templates.cpp)\n\nadd_executable(function-templates2 function-templates2.cpp)\n\nadd_executable(inc-com-stack inc-com-stack.cpp)\n\nadd_executable(specialise-explicit specialise-explicit.cpp)\n\nadd_executable(stack_main-partial stack_main-partial.cpp)\n\nadd_executable(stack_main stack_main.cpp)\n\nadd_executable(static static.cpp)\n\nadd_executable(template-template-after template-template-after.cpp)\n\nadd_executable(template-template-before template-template-before.cpp)\n\nadd_executable(tt-limits tt-limits.cpp)\n\nadd_executable(type-non-type type-non-type.cpp)\n\nadd_executable(typetraits1 typetraits1.cpp)\n\nadd_executable(typetraits2 typetraits2.cpp)\n\nadd_executable(typetraits3 typetraits3.cpp)\n\nadd_executable(typetraits4 typetraits4.cpp)\n\n","path":"code/6771/25T2/8.1/CMakeLists.txt","fileext":"txt"},"class-template-start-main.cpp":{"name":"class-template-start-main.cpp","content":"#include <iostream>\r\n#include <string>\r\n\r\n#include \"./class-template-start2.cpp\"\r\n\r\nint main() {\r\n  stack<int> s1; // int: template argument\r\n  s1.push(1);\r\n  s1.push(2);\r\n  stack<int> s2 = s1;\r\n  std::cout << s1 << s2 << '\\n';\r\n  s1.pop();\r\n  s1.push(3);\r\n  std::cout << s1 << s2 << '\\n';\r\n  // s1.push(\"hello\"); // Fails to compile.\r\n\r\n  stack<std::string> string_stack;\r\n  string_stack.push(\"hello\");\r\n  // string_stack.push(1); // Fails to compile.\r\n}","path":"code/6771/25T2/8.1/class-template-start-main.cpp","fileext":"cpp"},"class-template-start1.h":{"name":"class-template-start1.h","content":"// stack.h\r\n#ifndef STACK_H\r\n#define STACK_H\r\n\r\n#include <iostream>\r\n#include <vector>\r\n\r\ntemplate<typename T>\r\nclass stack {\r\npublic:\r\n  friend auto operator<<(std::ostream& os, const stack& s) -> std::ostream& {\r\n    for (const auto& i : s.stack_)\r\n      os << i << \" \";\r\n    return os;\r\n  }\r\n  auto push(T const& item) -> void;\r\n  auto pop() -> void;\r\n  auto top() -> T&;\r\n  auto top() const -> const T&;\r\n  auto empty() const -> bool;\r\n\r\nprivate:\r\n  std::vector<T> stack_;\r\n};\r\n\r\n#include \"./class-template-start2.cpp\"\r\n\r\n#endif // STACK_H","path":"code/6771/25T2/8.1/class-template-start1.h","fileext":"h"},"class-template-start2.cpp":{"name":"class-template-start2.cpp","content":"template<typename T>\r\nauto stack<T>::push(T const& item) -> void {\r\n  stack_.push_back(item);\r\n}\r\n\r\ntemplate<typename T>\r\nauto stack<T>::pop() -> void {\r\n  stack_.pop_back();\r\n}\r\n\r\ntemplate<typename T>\r\nauto stack<T>::top() -> T& {\r\n  return stack_.back();\r\n}\r\n\r\ntemplate<typename T>\r\nauto stack<T>::top() const -> T const& {\r\n  return stack_.back();\r\n}\r\n\r\ntemplate<typename T>\r\nauto stack<T>::empty() const -> bool {\r\n  return stack_.empty();\r\n}","path":"code/6771/25T2/8.1/class-template-start2.cpp","fileext":"cpp"},"default-members.cpp":{"name":"default-members.cpp","content":"#include <vector>\r\n#include <iostream>\r\n\r\ntemplate<typename T, typename CONT = std::vector<T>>\r\nclass stack {\r\npublic:\r\n  stack();\r\n  ~stack();\r\n  auto push(T&) -> void;\r\n  auto pop() -> void;\r\n  auto top() -> T&;\r\n  auto top() const -> T const&;\r\n  static int num_stacks_;\r\n\r\nprivate:\r\n  CONT stack_;\r\n};\r\n\r\ntemplate<typename T, typename CONT>\r\nint stack<T, CONT>::num_stacks_ = 0;\r\n\r\ntemplate<typename T, typename CONT>\r\nstack<T, CONT>::stack() {\r\n  num_stacks_++;\r\n}\r\n\r\ntemplate<typename T, typename CONT>\r\nstack<T, CONT>::~stack() {\r\n  num_stacks_--;\r\n}\r\n\r\nauto main() -> int {\r\n  auto fs = stack<float>{};\r\n  stack<int> is1, is2, is3;\r\n  std::cout << stack<float>::num_stacks_ << \"\\n\";\r\n  std::cout << stack<int>::num_stacks_ << \"\\n\";\r\n}","path":"code/6771/25T2/8.1/default-members.cpp","fileext":"cpp"},"friend.cpp":{"name":"friend.cpp","content":"#include <string>\r\n#include <iostream>\r\n#include <vector>\r\n\r\ntemplate<typename T>\r\nclass stack {\r\npublic:\r\n  auto push(T const&) -> void;\r\n  auto pop() -> void;\r\n\r\n  friend auto operator<<(std::ostream& os, stack<T> const& s) -> std::ostream& {\r\n    return os << \"My top item is \" << s.stack_.back() << \"\\n\";\r\n  }\r\n\r\nprivate:\r\n  std::vector<T> stack_;\r\n};\r\n\r\ntemplate<typename T>\r\nauto stack<T>::push(T const& t) -> void {\r\n  stack_.push_back(t);\r\n}\r\n\r\nauto main() -> int {\r\n  stack<std::string> ss;\r\n  ss.push(\"Hello\");\r\n  std::cout << ss << \"\\n\";\r\n\r\n  stack<int> is;\r\n  is.push(5);\r\n  std::cout << is << \"\\n\";\r\n}","path":"code/6771/25T2/8.1/friend.cpp","fileext":"cpp"},"function-templates.cpp":{"name":"function-templates.cpp","content":"#include <iostream>\r\n\r\nauto min(int a, int b) -> int {\r\n  return a < b ? a : b;\r\n}\r\n\r\nauto min(double a, double b) -> double{\r\n  return a < b ? a : b;\r\n}\r\n\r\nauto main() -> int {\r\n  std::cout << min(1, 2) << \"\\n\"; // calls line 1\r\n  std::cout << min(1.0, 2.0) << \"\\n\"; // calls line 4\r\n}","path":"code/6771/25T2/8.1/function-templates.cpp","fileext":"cpp"},"function-templates2.cpp":{"name":"function-templates2.cpp","content":"#include <iostream>\r\n\r\ntemplate <typename T>\r\nauto min(T a, T b) -> T {\r\n  return a < b ? a : b;\r\n}\r\n\r\nauto main() -> int {\r\n  std::cout << min(1, 2) << \"\\n\"; // calls int min(int, int)\r\n  std::cout << min(1.0, 2.0) << \"\\n\"; // calls double min(double, double)\r\n}","path":"code/6771/25T2/8.1/function-templates2.cpp","fileext":"cpp"},"inc-com-main.cpp":{"name":"inc-com-main.cpp","content":"#include <iostream>\r\n#include \"./inc-com-min.h\"\r\n\r\nauto main() -> int {\r\n  std::cout << min(1, 2) << \"\\n\";\r\n}","path":"code/6771/25T2/8.1/inc-com-main.cpp","fileext":"cpp"},"inc-com-min.cpp":{"name":"inc-com-min.cpp","content":"template <typename T>\r\nauto min(T a, T b) -> T {\r\n  return a < b ? a : b;\r\n}","path":"code/6771/25T2/8.1/inc-com-min.cpp","fileext":"cpp"},"inc-com-min.h":{"name":"inc-com-min.h","content":"template <typename T>\r\nauto min(T a, T b) -> T {\r\n  return a < b ? a : b;\r\n}","path":"code/6771/25T2/8.1/inc-com-min.h","fileext":"h"},"inc-com-minexp.cpp":{"name":"inc-com-minexp.cpp","content":"template <typename T>\r\nauto min(T a, T b) -> int {\r\n  return a < b ? a : b;\r\n}\r\n\r\ntemplate int min<int>(int, int);\r\ntemplate double min<double>(double, double);","path":"code/6771/25T2/8.1/inc-com-minexp.cpp","fileext":"cpp"},"inc-com-stack.cpp":{"name":"inc-com-stack.cpp","content":"#include <vector>\r\n\r\ntemplate <typename T>\r\nclass stack {\r\npublic:\r\n  stack() {}\r\n  auto pop() -> void;\r\n  auto push(const T& i) -> void;\r\nprivate:\r\n  std::vector<T> items_;\r\n};\r\n\r\ntemplate <typename T>\r\nauto stack<T>::pop() -> void {\r\n  items_.pop_back();\r\n}\r\n\r\ntemplate <typename T>\r\nauto stack<T>::push(const T& i) -> void {\r\n  items_.push_back(i);\r\n}\r\n\r\nauto main() -> int {\r\n  stack<int> s;\r\n  s.push(5);\r\n}","path":"code/6771/25T2/8.1/inc-com-stack.cpp","fileext":"cpp"},"specialise-explicit.cpp":{"name":"specialise-explicit.cpp","content":"#include <iostream>\r\n\r\ntemplate <typename T>\r\nstruct is_void {\r\n  static bool const val = false;\r\n};\r\n\r\ntemplate<>\r\nstruct is_void<void> {\r\n  static bool const val = true;\r\n};\r\n\r\nauto main() -> int {\r\n  std::cout << is_void<int>::val << \"\\n\";\r\n  std::cout << is_void<void>::val << \"\\n\";\r\n}","path":"code/6771/25T2/8.1/specialise-explicit.cpp","fileext":"cpp"},"stack-partial.h":{"name":"stack-partial.h","content":"#include <numeric>\r\n\r\n#include \"./stack.h\"\r\n\r\ntemplate <typename T>\r\nclass stack<T*> {\r\npublic:\r\n  auto push(T* t) -> void { stack_.push_back(t); }\r\n  auto top() -> T* { return stack_.back(); }\r\n  auto pop() -> void { stack_.pop_back(); }\r\n  auto size() const -> std::size_t { return stack_.size(); };\r\n  auto sum() -> int{\r\n    return std::accumulate(stack_.begin(),\r\n          stack_.end(), 0, [] (int a, T *b) { return a + *b; });\r\n  }\r\nprivate:\r\n  std::vector<T*> stack_;\r\n};\r\n","path":"code/6771/25T2/8.1/stack-partial.h","fileext":"h"},"stack.h":{"name":"stack.h","content":"#include <vector>\r\n#include <iostream>\r\n#include <numeric>\r\n\r\ntemplate <typename T>\r\nclass stack {\r\npublic:\r\n  auto push(T t) -> void { vec_.push_back(t); }\r\n  auto top() -> T& { return vec_.back(); }\r\n  auto pop() -> void { vec_.pop_back(); }\r\n  auto size() const -> std::size_t { return vec_.size(); };\r\n  auto sum() -> int {\r\n    return std::accumulate(vec_.begin(), vec_.end(), 0);\r\n  }\r\nprivate:\r\n  std::vector<T> vec_;\r\n};\r\n","path":"code/6771/25T2/8.1/stack.h","fileext":"h"},"stack_main-partial.cpp":{"name":"stack_main-partial.cpp","content":"#include \"./stack-partial.h\"\r\n\r\nauto main() -> int {\r\n  auto i1 = 6771;\r\n  auto i2 = 1917;\r\n\r\n  auto s1 = stack<int*>{};\r\n  s1.push(&i1);\r\n  s1.push(&i2);\r\n  std::cout << s1.size() << \" \";\r\n  std::cout << s1.top() << \" \";\r\n  std::cout << s1.sum() << \"\\n\";\r\n}\r\n","path":"code/6771/25T2/8.1/stack_main-partial.cpp","fileext":"cpp"},"stack_main.cpp":{"name":"stack_main.cpp","content":"#include \"./stack-partial.h\"\r\n\r\nauto main() -> int {\r\n  auto i1 = 6771;\r\n  auto i2 = 1917;\r\n\r\n  auto s1 = stack<int*>{};\r\n  s1.push(&i1);\r\n  s1.push(&i2);\r\n  std::cout << s1.size() << \" \";\r\n  std::cout << s1.top() << \" \";\r\n  std::cout << s1.sum() << \"\\n\";\r\n}","path":"code/6771/25T2/8.1/stack_main.cpp","fileext":"cpp"},"static.cpp":{"name":"static.cpp","content":"#include <iostream>\r\n#include <vector>\r\n\r\ntemplate<typename T>\r\nclass stack {\r\npublic:\r\n  stack();\r\n  ~stack();\r\n  auto push(T&) -> void;\r\n  auto pop() -> void;\r\n  auto top() -> T&;\r\n  auto top() const -> const T&;\r\n  static int num_stacks_;\r\n\r\nprivate:\r\n  std::vector<T> stack_;\r\n};\r\n\r\ntemplate<typename T>\r\nint stack<T>::num_stacks_ = 0;\r\n\r\ntemplate<typename T>\r\nstack<T>::stack() {\r\n  num_stacks_++;\r\n}\r\n\r\ntemplate<typename T>\r\nstack<T>::~stack() {\r\n  num_stacks_--;\r\n}\r\n\r\nauto main() -> int {\r\n  stack<float> fs;\r\n  stack<int> is1, is2, is3;\r\n  std::cout << stack<float>::num_stacks_ << \"\\n\";\r\n  std::cout << stack<int>::num_stacks_ << \"\\n\";\r\n}","path":"code/6771/25T2/8.1/static.cpp","fileext":"cpp"},"template-template-after.cpp":{"name":"template-template-after.cpp","content":"#include <iostream>\r\n#include <vector>\r\n#include <memory>\r\n\r\ntemplate <typename T, template <typename...> typename CONT>\r\nclass stack {\r\npublic:\r\n  auto push(T t) -> void { stack_.push_back(t); }\r\n  auto pop() -> void { stack_.pop_back(); }\r\n  auto top() -> T& { return stack_.back(); }\r\n  auto empty() const -> bool { return stack_.empty(); }\r\nprivate:\r\n  CONT<T> stack_;\r\n};\r\n\r\n#include <iostream>\r\n#include <vector>\r\n\r\nauto main(void) -> int {\r\n  auto s1 = stack<int, std::vector>{};\r\n  s1.push(1);\r\n  s1.push(2);\r\n} \r\n","path":"code/6771/25T2/8.1/template-template-after.cpp","fileext":"cpp"},"template-template-before.cpp":{"name":"template-template-before.cpp","content":"#include <iostream>\r\n#include <vector>\r\n\r\ntemplate <typename T, typename CONT>\r\nclass stack {\r\npublic:\r\n  auto push(T t) -> void { stack_.push_back(t); }\r\n  auto pop() -> void { stack_.pop_back(); }\r\n  auto top() -> T& { return stack_.back(); }\r\n  auto empty() const -> bool { return stack_.empty(); }\r\nprivate:\r\n  CONT stack_;\r\n};\r\n\r\nauto main(void) -> int {\r\n  stack<int, std::vector<int>> s1;\r\n  int i1 = 1;\r\n  int i2 = 2;\r\n  s1.push(i1);\r\n  s1.push(i2);\r\n  while (!s1.empty()) {\r\n    std::cout << s1.top() << \" \";\r\n    s1.pop();\r\n  }\r\n  std::cout << \"\\n\";\r\n} ","path":"code/6771/25T2/8.1/template-template-before.cpp","fileext":"cpp"},"tt-limits.cpp":{"name":"tt-limits.cpp","content":"#include <iostream>\r\n#include <limits>\r\n\r\ntemplate <typename T>\r\nstruct numeric_limits {\r\n  static auto min() -> T;\r\n};\r\n\r\ntemplate <>\r\nstruct numeric_limits<int> {\r\n  static auto min() -> int { return -99999999 - 1; }\r\n};\r\n\r\ntemplate <>\r\nstruct numeric_limits<double> {\r\n  static auto min() -> double { return -999999999.99999 - 1.0; }\r\n};\r\n\r\nauto main() -> int {\r\n  std::cout << std::numeric_limits<double>::min() << \"\\n\";\r\n  std::cout << std::numeric_limits<int>::min() << \"\\n\";\r\n}","path":"code/6771/25T2/8.1/tt-limits.cpp","fileext":"cpp"},"type-non-type.cpp":{"name":"type-non-type.cpp","content":"#include <array>\r\n#include <iostream>\r\n\r\ntemplate<typename T, std::size_t size>\r\nauto findmin(const std::array<T, size> a) -> T {\r\n\tT min = a[0];\r\n\tfor (std::size_t i = 1; i < size; ++i) {\r\n\t\tif (a[i] < min)\r\n\t\t\tmin = a[i];\r\n\t}\r\n\treturn min;\r\n}\r\n\r\nauto main() -> int {\r\n\tstd::array<int, 3> x{3, 1, 2};\r\n\tstd::array<double, 4> y{3.3, 1.1, 2.2, 4.4};\r\n\tstd::cout << \"min of x = \" << findmin(x) << \"\\n\";\r\n\tstd::cout << \"min of x = \" << findmin(y) << \"\\n\";\r\n}\r\n","path":"code/6771/25T2/8.1/type-non-type.cpp","fileext":"cpp"},"type-non-type2.cpp":{"name":"type-non-type2.cpp","content":"auto findmin(const std::array<int, 3> a) -> int {\r\n  int min = a[0];\r\n  for (int i = 1; i < 3; ++i) {\r\n    if (a[i] < min)\r\n      min = a[i];\r\n  }\r\n  return min;\r\n}\r\n\r\nauto findmin(const std::array<double, 4> a) -> double {\r\n  double min = a[0];\r\n  for (int i = 1; i < 4; ++i) {\r\n    if (a[i] < min)\r\n      min = a[i];\r\n  }\r\n  return min;\r\n}","path":"code/6771/25T2/8.1/type-non-type2.cpp","fileext":"cpp"},"typetraits1.cpp":{"name":"typetraits1.cpp","content":"#include <array>\r\n#include <iostream>\r\n#include <limits>\r\n\r\ntemplate<typename T, std::size_t size>\r\nT findMax(const std::array<T, size>& arr) {\r\n  T largest = std::numeric_limits<T>::min();\r\n  for (auto const& i : arr) {\r\n    if (i > largest)\r\n      largest = i;\r\n  }\r\n  return largest;\r\n}\r\n\r\nauto main() -> int {\r\n  auto i = std::array<int, 3>{-1, -2, -3};\r\n  std::cout << findMax<int, 3>(i) << \"\\n\";\r\n  auto j = std::array<double, 3>{1.0, 1.1, 1.2};\r\n  std::cout << findMax<double, 3>(j) << \"\\n\";\r\n}","path":"code/6771/25T2/8.1/typetraits1.cpp","fileext":"cpp"},"typetraits2.cpp":{"name":"typetraits2.cpp","content":"#include <iostream>\r\n\r\ntemplate <typename T>\r\nstruct is_void {\r\n  static const bool val = false;\r\n};\r\n\r\ntemplate<>\r\nstruct is_void<void> {\r\n  static const bool val = true;\r\n};\r\n\r\nauto main() -> int {\r\n  std::cout << is_void<int>::val << \"\\n\";\r\n  std::cout << is_void<void>::val << \"\\n\";\r\n}","path":"code/6771/25T2/8.1/typetraits2.cpp","fileext":"cpp"},"typetraits3.cpp":{"name":"typetraits3.cpp","content":"#include <iostream>\r\n\r\ntemplate <typename T>\r\nstruct is_pointer {\r\n  static const bool val = false;\r\n};\r\n\r\ntemplate<typename T>\r\nstruct is_pointer<T*> {\r\n  static const bool val = true;\r\n};\r\n\r\nauto main() -> int {\r\n  std::cout << is_pointer<int*>::val << \"\\n\";\r\n  std::cout << is_pointer<int>::val << \"\\n\";\r\n}","path":"code/6771/25T2/8.1/typetraits3.cpp","fileext":"cpp"},"typetraits4.cpp":{"name":"typetraits4.cpp","content":"#include <iostream>\r\n#include <type_traits>\r\n\r\ntemplate<typename T>\r\nauto testIfNumberType(T i) -> void {\r\n  if (std::is_integral<T>::value || std::is_floating_point<T>::value) {\r\n    std::cout << i << \" is a number\"\r\n              << \"\\n\";\r\n  }\r\n  else {\r\n    std::cout << i << \" is not a number\"\r\n              << \"\\n\";\r\n  }\r\n}\r\n\r\nauto main() -> int {\r\n  auto i = int{6};\r\n  auto l = long{7};\r\n  auto d = double{3.14};\r\n  testIfNumberType(i);\r\n  testIfNumberType(l);\r\n  testIfNumberType(d);\r\n  testIfNumberType(123);\r\n  testIfNumberType(\"Hello\");\r\n  auto s = \"World\";\r\n  testIfNumberType(s);\r\n}","path":"code/6771/25T2/8.1/typetraits4.cpp","fileext":"cpp"}}},"__N_SSG":true}