use dvided module

This commit is contained in:
ulic-youthlic 2025-04-28 13:58:27 +08:00
parent 0017c36e2f
commit 37c11c32cf
Signed by: youthlic
GPG key ID: 63E86C3C14A0D721
4 changed files with 81 additions and 63 deletions

View file

@ -1,59 +1,5 @@
import <print>;
import <type_traits>;
template <bool param1 = false, bool param2 = false>
struct Builder;
template <bool enabled>
struct BuildMixin {};
template <>
struct BuildMixin<true> {
auto build(this auto&& self)
requires requires { self.p1 + self.p2; }
{
return self.p1 + self.p2;
}
};
template <bool enabled>
struct Param1Mixin {};
template <>
struct Param1Mixin<false> {
auto fill_param1(this auto&& self)
requires requires { self.p1; }
{
self.p1 = 1;
return Builder<true, std::remove_reference_t<decltype(self)>::param2_v>(
self);
}
};
template <bool enabled>
struct Param2Mixin {};
template <>
struct Param2Mixin<false> {
auto fill_param2(this auto&& self)
requires requires { self.p2; }
{
self.p2 = 1;
return Builder<std::remove_reference_t<decltype(self)>::param1_v, true>(
self);
}
};
template <bool param1, bool param2>
struct Builder : BuildMixin<param1 && param2>,
Param1Mixin<param1>,
Param2Mixin<param2> {
const constinit static auto param1_v = param1;
const constinit static auto param2_v = param2;
int p1;
int p2;
Builder() : p1(0), p2(0) {}
Builder(auto&& other) : p1(other.p1), p2(other.p2) {}
};
import builder;
auto main() -> int {
Builder builder;