I’m going to be honest, haven’t looked at this in that close of a detail.
But here is something that standout quite obviously.
Addresses of functions are not constant expressions, and template arguments are required to be a constant expression known at compile time.
There’s no guarantee that the addresses of different functions are distinct, or have a certain order, that they exist at all, and in certain case they might not even be known until runtime.
So, I have absolutely no idea how you would envision this to work.
From: Std-Proposals <std-proposals-bounces@lists.isocpp.org>
On Behalf Of organicoman via Std-Proposals
Sent: Wednesday, July 10, 2024 19:39
To: Andrey Semashev via Std-Proposals <std-proposals@lists.isocpp.org>
Cc: organicoman <organicoman@yahoo.fr>
Subject: Re: [std-proposals] template params of a function template
>> template<void(*)(int)>
>> struct A { // impl };
>You can't. A function pointer points to a >function. You can't have a
>pointer to a function template. So, at the >point when A is instantiated,
>the function pointer must be either null or >point to a function, whether
>it was generated as a result of a function >template instantiation or was
>never a template to begin with.
Yet a function pointer is compile time constant, that means we can examine its properties at compile time. And the template arguments are among these properties.
This is related to type erasure.
I think the compiler should allow a way to access the template arguments of a function pointer.
Because when we pass a function pointer generated from a function template usually we do
A<foo<T1,T2>> a;
Which is mandatory to avoid overload ambiguity.
And at this point, we see clearly the template arguments, and i don't see why the compiler can't see them!
Sent from my Galaxy