Add constexpr check example
This commit is contained in:
parent
f3f1ac56c0
commit
f10d428cfa
2 changed files with 48 additions and 6 deletions
|
@ -68,11 +68,13 @@ if(ENABLE_EXAMPLES)
|
||||||
file(GLOB EXAMPLES_SRC "examples/src/*.cpp")
|
file(GLOB EXAMPLES_SRC "examples/src/*.cpp")
|
||||||
foreach(EXAMPLE_SRC ${EXAMPLES_SRC})
|
foreach(EXAMPLE_SRC ${EXAMPLES_SRC})
|
||||||
get_filename_component(EXAMPLE_NAME ${EXAMPLE_SRC} NAME_WE)
|
get_filename_component(EXAMPLE_NAME ${EXAMPLE_SRC} NAME_WE)
|
||||||
add_executable(${EXAMPLE_NAME} ${EXAMPLE_SRC})
|
if(NOT ${EXAMPLE_NAME} STREQUAL "constexpr_check")
|
||||||
target_link_libraries(${EXAMPLE_NAME} cserver)
|
add_executable(${EXAMPLE_NAME} ${EXAMPLE_SRC})
|
||||||
set_property(TARGET ${EXAMPLE_NAME} PROPERTY CXX_STANDARD 23)
|
target_link_libraries(${EXAMPLE_NAME} cserver)
|
||||||
set_target_properties(${EXAMPLE_NAME} PROPERTIES
|
set_property(TARGET ${EXAMPLE_NAME} PROPERTY CXX_STANDARD 23)
|
||||||
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/examples/output/")
|
set_target_properties(${EXAMPLE_NAME} PROPERTIES
|
||||||
endforeach()
|
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/examples/output/")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
40
examples/src/constexpr_check.cpp
Normal file
40
examples/src/constexpr_check.cpp
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
#include <cserver/components/loggable_component_base.hpp>
|
||||||
|
|
||||||
|
|
||||||
|
struct SomeComponent {
|
||||||
|
static constexpr utempl::ConstexprString kName = "component";
|
||||||
|
|
||||||
|
constexpr SomeComponent(auto&) {};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct SomeComponent2 {
|
||||||
|
static constexpr utempl::ConstexprString kName = "component2";
|
||||||
|
|
||||||
|
constexpr SomeComponent2(auto&) {};
|
||||||
|
};
|
||||||
|
|
||||||
|
struct OtherComponent {
|
||||||
|
static constexpr utempl::ConstexprString kName = "other";
|
||||||
|
|
||||||
|
auto Foo(auto& context) -> void {
|
||||||
|
context.template FindComponent<"component2">(); // UB on runtime with old check
|
||||||
|
// Compile time error with new check(check via loopholes)
|
||||||
|
};
|
||||||
|
|
||||||
|
constexpr OtherComponent(auto& context) {
|
||||||
|
context.template FindComponent<"component">();
|
||||||
|
Foo(context);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
auto main() -> int {
|
||||||
|
cserver::ServiceContextBuilder{}
|
||||||
|
.AppendConfigParam<"threads", 8>()
|
||||||
|
.Append<SomeComponent>()
|
||||||
|
.Append<SomeComponent2>()
|
||||||
|
.Append<OtherComponent>()
|
||||||
|
.Sort()
|
||||||
|
.Run();
|
||||||
|
};
|
Loading…
Reference in a new issue