diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index f77b4bd25..adcee5704 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -27,4 +27,5 @@ add_subdirectory(libslic3r) add_subdirectory(timeutils) add_subdirectory(fff_print) add_subdirectory(sla_print) +add_subdirectory(cpp17) # add_subdirectory(example) 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 +#include +#include +#include +// Test for nested namespace definition +namespace PrusaSlicer::Cpp17 { + +template class Foo +{ + T m_arg; +public: + + explicit Foo(T &&arg): m_arg{arg} {} +}; + +} // namespace PrusaSlicer::Cpp17 + +template 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) { + 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; +}