Re: function pointer as template parameter + type deduction
* er:
Hi,
here's a problem:
struct A{};
void f(const A&a){}
template<typename T,void (*)(const T&)>
void g(const T& t){}
What's the point of the unnamed template parameter?
One suspects a case Evil Premature Optimization, that the intention is to shave
a (conjectured but quite possibly not even real) nano-second by calling some
routine "directly" instead of having it passed as a routine pointer argument.
EPO is unfortunately a root cause of so much extreme and unnecessary complexity.
template<typename T>
void g2(const T& t,void (*)(const T&)){}
A a;
g<f>(a); // (1)
g<A,f>(a); // (2)
g2(a,f); // (3)
(2) and (3) compile fine, not 1. Why exactly?
You have defined g with two template parameters, one which is anonymous and
therefore cannot ever be deduced, hence must always be explicitly specified.
Any suggestion to approach (1)?
Don't. :-)
You're into the second root cause of extreme and unnecessary complexity, namely
the Elegant Notation Fetish (ENF), where almost any absurdly huge baggage of
cryptic, complex, counter-intuitive code is deemed acceptable to shave /one/
character, or perhaps two, in a single very unimportant expression somewhere.
But if you strongly feel that providing the type parameter is very un-elegant,
that it simply must be deduced from the specified function, then perhaps like
<code>
struct A{};
void f(const A&a){}
struct F
{
typedef A ArgType;
static void effect( ArgType const& a ) { ::f( a ); }
};
template< class Func >
void g( typename Func::ArgType const& t ) {}
int main()
{
A a;
g<F>(a);
}
</code>
Cheers & hth.,
- Alf
--
Due to hosting requirements I need visits to <url: http://alfps.izfree.com/>.
No ads, and there is some C++ stuff! :-) Just going there is good. Linking
to it is even better! Thanks in advance!