What About: func PointerOrError[T *Q, Q any](s C.StatusOr ) (t T, err error)
Seems to compile: https://go.dev/play/p/n4I-XkONj-O?v=gotip On Saturday, April 15, 2023 at 6:28:39 AM UTC-4 Jan wrote: > hi, > > This is a variation for a previous topic > <https://groups.google.com/g/golang-nuts/c/h75BwBsz4YA/m/FLBIjgFBBQAJ>, > but since there isn't a clear solution, I thought I would ask if anyone can > think of a work around. > > I've been interacting a lot with C++ libraries from Go, and one of the > commonly returned types is an abls::StatusOr > <https://abseil.io/docs/cpp/guides/status>, for which I created a simple > C wrapper that casts the error and value to a `char *` and `void *` > respectively (dropping the type information in between C++ and Go). > > In Go I want to return the type information, so I defined a small generic > function: > > // PointerOrError converts a StatusOr structure to either a pointer to T > with the data > // or the Status converted to an error message and then freed. > func PointerOrError[T any](s C.StatusOr) (*T, error) { > ptr, err := UnsafePointerOrError(s) // returns unsafe.Pointer, error > if err != nil { > return nil, err > } > return (*T)(ptr), nil > } > > Now this doesn't work for my forward declared C++ types (most of them are > just aliases to C++ objects) -- Go complaints with: `cannot use > incomplete (or unallocatable) type as a type argument`, because `T` is > incomplete indeed. > > But ... I will never instantiate `T`, I only care about `*T`, which is not > incomplete. > > But there isn't a way to say a generics attribute is a pointer. So if I > use the following: > > func PointerOrError2[T any](s C.StatusOr) (t T, err error) { > var ptr unsafe.Pointer > ptr, err = UnsafePointerOrError(s) // <-- unsafe.Pointer, error > if err != nil { > return > } > t = (T)(ptr) > return > } > > And instantiate it with a `PointerOrError2[*MyType](statusOr)` for > instance, I get, as expected: > > cannot convert ptr (variable of type unsafe.Pointer) to type T > > Any suggestions to make this work ? > > I could probably craft something using the `reflect` package, but I was > hoping for a smart (and likely faster?) generics solution. > > cheers > Jan > > > > > > > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/b9e377dd-4ef8-4cdf-8c36-80cb086910b1n%40googlegroups.com.