Date: Fri, 26 Mar 2021 15:49:42 -0400
> On Mar 26, 2021, at 3:32 PM, Barry Revzin <barry.revzin_at_[hidden]> wrote:
>
>
>
> On Fri, Mar 26, 2021 at 2:00 PM David Rector via SG7 <sg7_at_[hidden] <mailto:sg7_at_[hidden]>> wrote:
> Attached is a new paper addressing how the P2237/P2230 facilities might be expanded to be able handle the `Sum<T,U>` example discussed awhile back, and more generally subsume the capabilities of the "string-injection" approach, while avoiding its drawbacks.
>
> Hi David,
>
> I didn't understand the Sum<T, U> example before and I still don't. There's not really a description of it in the paper, just a lot of code. What problem is it demonstrating?
>
> Barry
Thanks for this feedback, I should add an example and context to the paper.
This was originally presented awhile back on this list; https://lists.isocpp.org/sg7/2021/02/0186.php is where I give a crude description of its possible utility, which Ville improves upon by suggesting this could be implemented as a generalization of the Mediator-Observer pattern (https://lists.isocpp.org/sg7/2021/02/0187.php; following that there is some good discussion about the how design patterns in general are good examples for metaprogramming, a good way to identify deficiencies.
The crude implementation in the paper might work as follows:
```
#include SumTU.h // Sum<T,U>
template <class T, class U>
class operator_plus_exists {...}; //sfinae detector
template<typename T, typename U,
typename = std::enable_if_t<!operator_plus_exists <T, U>::value>>
Sum<T, U> operator+(T t, U u) {
return Sum<T, U>(t, u);
}
struct A {
int f;
int g;
};
struct B {
int g;
A h;
};
struct C {
int f;
int g;
B h; //NB different type from B::h
};
int main() {
A a1{.f = 1, .g = 2};
A a2{.f = 3, .g = 6};
B b{ .g = 3, .h = A{.f = 4, .g = 5}}
C c( .f = 7, .g = 1, .h = B{ .g = 3, .h = A{.f = 1, .g = 2});
Sum<Sum<Sum<A,A>, B>, C> res = a1 + a2 + b + c;
assert(res.f = 11);
assert(res.g = 12);
Sum<A,B> res2 = res.h;
assert(res2.g == 8);
}
```
>
>
>
> On Fri, Mar 26, 2021 at 2:00 PM David Rector via SG7 <sg7_at_[hidden] <mailto:sg7_at_[hidden]>> wrote:
> Attached is a new paper addressing how the P2237/P2230 facilities might be expanded to be able handle the `Sum<T,U>` example discussed awhile back, and more generally subsume the capabilities of the "string-injection" approach, while avoiding its drawbacks.
>
> Hi David,
>
> I didn't understand the Sum<T, U> example before and I still don't. There's not really a description of it in the paper, just a lot of code. What problem is it demonstrating?
>
> Barry
Thanks for this feedback, I should add an example and context to the paper.
This was originally presented awhile back on this list; https://lists.isocpp.org/sg7/2021/02/0186.php is where I give a crude description of its possible utility, which Ville improves upon by suggesting this could be implemented as a generalization of the Mediator-Observer pattern (https://lists.isocpp.org/sg7/2021/02/0187.php; following that there is some good discussion about the how design patterns in general are good examples for metaprogramming, a good way to identify deficiencies.
The crude implementation in the paper might work as follows:
```
#include SumTU.h // Sum<T,U>
template <class T, class U>
class operator_plus_exists {...}; //sfinae detector
template<typename T, typename U,
typename = std::enable_if_t<!operator_plus_exists <T, U>::value>>
Sum<T, U> operator+(T t, U u) {
return Sum<T, U>(t, u);
}
struct A {
int f;
int g;
};
struct B {
int g;
A h;
};
struct C {
int f;
int g;
B h; //NB different type from B::h
};
int main() {
A a1{.f = 1, .g = 2};
A a2{.f = 3, .g = 6};
B b{ .g = 3, .h = A{.f = 4, .g = 5}}
C c( .f = 7, .g = 1, .h = B{ .g = 3, .h = A{.f = 1, .g = 2});
Sum<Sum<Sum<A,A>, B>, C> res = a1 + a2 + b + c;
assert(res.f = 11);
assert(res.g = 12);
Sum<A,B> res2 = res.h;
assert(res2.g == 8);
}
```
Received on 2021-03-26 14:49:45