diff options
author | tamasmeszaros <meszaros.q@gmail.com> | 2019-12-05 16:40:31 +0300 |
---|---|---|
committer | tamasmeszaros <meszaros.q@gmail.com> | 2019-12-05 16:40:31 +0300 |
commit | 5623e0b3409c7f0c7d6c655d32c176a852f00719 (patch) | |
tree | 25ed8f7a8a90f4d5ba4f9e3ba2a2ccc292fa68c5 /tests/cpp17 | |
parent | 60758abbb4554f32e74f3d33dfebe9b9980c4aed (diff) |
Test cpp17 features on the build server.
Diffstat (limited to 'tests/cpp17')
-rw-r--r-- | tests/cpp17/CMakeLists.txt | 9 | ||||
-rw-r--r-- | tests/cpp17/main.cpp | 72 |
2 files changed, 81 insertions, 0 deletions
diff --git a/tests/cpp17/CMakeLists.txt b/tests/cpp17/CMakeLists.txt new file mode 100644 index 000000000..4e151ecbf --- /dev/null +++ b/tests/cpp17/CMakeLists.txt @@ -0,0 +1,9 @@ +cmake_minimum_required(VERSION 3.1) + +project(Cpp17Test) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +add_executable(cpp17test main.cpp) + diff --git a/tests/cpp17/main.cpp b/tests/cpp17/main.cpp new file mode 100644 index 000000000..2fc60d635 --- /dev/null +++ b/tests/cpp17/main.cpp @@ -0,0 +1,72 @@ +#include <cstdlib> +#include <iostream> +#include <tuple> +#include <string> +// Test for nested namespace definition +namespace PrusaSlicer::Cpp17 { + +template<class T> class Foo +{ + T m_arg; +public: + + explicit Foo(T &&arg): m_arg{arg} {} +}; + +} // namespace PrusaSlicer::Cpp17 + +template<class T> std::string get_type(const T &v); + +template<> std::string get_type(const int &) { return "int"; } +template<> std::string get_type(const double &) { return "double"; } +template<> std::string get_type(const float &) { return "double"; } + +int main() +{ + // ///////////////////////////////////////////////////////////////////////// + // Template argument deduction for class templates + // ///////////////////////////////////////////////////////////////////////// + + auto foo = PrusaSlicer::Cpp17::Foo{1.f}; + + // ///////////////////////////////////////////////////////////////////////// + // Structured bindings: + // ///////////////////////////////////////////////////////////////////////// + + auto my_tuple = std::make_tuple(0.2, 10); + + auto [a, b] = my_tuple; + + std::cout << "a is " << get_type(a) << std::endl; + std::cout << "b is " << get_type(b) << std::endl; + + // ///////////////////////////////////////////////////////////////////////// + // Test for std::apply() + // ///////////////////////////////////////////////////////////////////////// + + auto fun = [] (auto a, auto b) { + std::cout << "a (" << get_type(a) << ") = " << a << std::endl; + std::cout << "b (" << get_type(b) << ") = " << b << std::endl; + }; + + std::apply(fun, my_tuple); + + // ///////////////////////////////////////////////////////////////////////// + // constexpr lambda and if + // ///////////////////////////////////////////////////////////////////////// + + auto isIntegral = [](auto v) constexpr -> bool { + if constexpr (std::is_integral_v<decltype(v)>) { + return true; + } else { + return false; + } + }; + + static_assert (isIntegral(10), "" ); + // would fail to compile: static_assert (isIntegral(10.0), "" ); + std::cout << "Integer is integral: " << isIntegral(0) << std::endl; + std::cout << "Floating point is not integral: " << isIntegral(0.0) << std::endl; + + return EXIT_SUCCESS; +} |