模板参数推导有关问题

模板参数推导问题
#include   <cstdio>
#include   <boost/lexical_cast.hpp>

template   <typename   T,   T   f>     struct   WapperFunction;

template   <typename   RetType,   RetType   (*f)()>
struct   WapperFunction <RetType(*)(),   f>
{
static   void   call()
{
RetType   x   =   f();

printf( "Call   result   of   0X%p   {%s}   is   %s   {%s}\n\n ",   f,   typeid(f).name(),
boost::lexical_cast <std::string> (x).c_str(),   typeid(x).name());
}
};

template   <typename   RetType,   typename   Arg1Type,   RetType   (*f)(Arg1Type)>
struct   WapperFunction <RetType(*)(Arg1Type),   f>
{
static   void   call()
{
Arg1Type   arg1;
RetType     ret;

printf( "Enter   the   argument1{%s}: ",   typeid(Arg1Type).name());
std::cin> > arg1;

ret   =   f(arg1);

printf( "Call   result   of   0X%p   {%s}   is   %s   {%s}\n\n ",   f,   typeid(f).name(),
boost::lexical_cast <std::string> (ret).c_str(),   typeid(ret).name());
}
};


int   f1()
{
return   0;
}

int   f2(int   x)
{
return   x   *   x;
}

int   main()
{
WapperFunction <int(*)(),   f1> ::call();
WapperFunction <int(*)(int),   f2> ::call();
};

运行效果如:

Call   result   of   0X00441361   {int   (__cdecl*)(void)}   is   0   {int}

Enter   the   argument1{int}:23
Call   result   of   0X00441906   {int   (__cdecl*)(int)}   is   529   {int}

现在的问题是   WapperFunction <int(*)(int),   f2> ::call();   的调用中第一个模板参数   int(*)(int)   是可以从第二个参数   f2   中推导出来的。但应该如何使用才能让它进行推导?   使调用方式为:

WapperFunction <f1> ::call();
WapperFunction <f2> ::call();

或者有办法在运行期来生成全局函数的话,这种调用方式也可以:

WapperFunction::call(f1);
WapperFunction::call(f2);

注意生成的必须要是全局函数,不能是函数对象(需要和   C   API   交互)。




------解决方案--------------------
为什么不直接使用全局函数呢?

#include <cstdio>
#include <iostream>
#include <boost/lexical_cast.hpp>

template <typename RetType>
void call(RetType(*f)())
{
RetType x = f();

printf( "Call result of 0X%p {%s} is %s {%s}\n\n ", f, typeid(f).name(),
boost::lexical_cast <std::string> (x).c_str(), typeid(x).name());
}

template <typename RetType, typename Arg1Type>
static void call(RetType(*f)(Arg1Type))
{
Arg1Type arg1;
RetType ret;

printf( "Enter the argument1{%s}: ", typeid(Arg1Type).name());
std::cin> > arg1;

ret = f(arg1);

printf( "Call result of 0X%p {%s} is %s {%s}\n\n ", f, typeid(f).name(),
boost::lexical_cast <std::string> (ret).c_str(), typeid(ret).name());
}

int f1()
{
return 0;
}

int f2(int x)
{
return x * x;
}

int main()
{
call(&f1);
call(&f2);
}
------解决方案--------------------