Man and nature coexist.
esv::same_assert and esv::same_strip_assert are used to test if two types are the same or not the same. They are alias template, being useful at compile-time.
esv::same_assert<t1, t2>()
is the shorthand combination of static_assert(std::same_as<t1, t2>)
esv::same_strip_assert<t1, t2>()
is the shorthand combination of static_assert(std::same_as<std::remove_cvref_t<t1>, std::remove_cvref_t<t2>>)
esv::same_assert<type_xt, type_yt, true>();
esv::same_assert<type_xt, type_yt, false>();
esv::same_assert<type_xt, type_yt>(); // Default true
esv::same_assert is alias template of class esv::same_assert_class, whose constructor is consteval, and static_assert is evaluated at its constructor.
esv::same_strip_assert<type_xt, type_yt, true>();
esv::same_strip_assert<type_xt, type_yt, false>();
esv::same_strip_assert<type_xt, type_yt>(); // Default true
esv::same_strip_assert is alias template of class esv::same_strip_assert_class, whose constructor is consteval, and static_assert is evaluated at its constructor.
The difference between esv::same_strip_assert and esv::same_assert is that
esv::same_strip_assert will apply esv::remove_cvref_t before calling static_assert<esv::same_as<...
.
#include <esvcpp/core.hpp> #include <iostream> int main() { const int & x = 123; esv::same_assert<decltype(x), int, false>(); esv::same_assert<esv::i32, esv::i32>(); esv::same_strip_assert<decltype(x), int, true>(); esv::same_strip_assert<decltype(x), int>(); std::cout << "pass\n"; esv::print("pass"); }