如何在模板实例化时确定函数的返回类型?

时间:2011-06-20 23:03:50

标签: c++ templates return-value function-pointers return-type

有没有办法找出函数的返回类型(甚至更好的函数指针)是什么?

我有以下代码,当我使用void函数指针时它会中断,但对任何其他返回类型都可以正常工作。从gcc 4.5使用void函数指针时得到的错误是:

  

错误:无法忽略void值,因为它应该是

哪个有道理。所以显然我需要检查函数指针是否返回一些东西,然后获取结果并返回它。

template <class F,typename R> class Instruction
{
  protected:
    F (func);
    R result;

  public:

   template <typename T>
   Instruction(T const& f)
   {
     func = &f;
   };

   template <typename A> void execute(A const& a)
   {
     result = (func)(a);
   };
   template <typename A> void execute(A const& a,A const& b)
   {
     result = (func)(a,b);
   };
   template <typename A> void execute(A const& a,A const& b,A const& c)
   {
     result = (func)(a,b,c);
   };
   R get_result()
   {
     return result;
   }; 
};

通常我使用一个函数指针来处理一个函数,该函数主要执行算术运算,我可以在void函数以外的实例化中处理任何返回类型。我试过实例化为:

     Instruction<ptr2func2,void> foo(bar);
     Instruction<ptr2func2,(*void)> foo(bar);

但在两种情况下都失败了。

实例化时的第二个模板参数用于定义返回类型。

3 个答案:

答案 0 :(得分:3)

void上尝试template partial specialization

template <class F> class Instruction<F, void>
{
  protected:
    F (func);

  public:

   template <typename T>
   Instruction(T const& f)
   {
     func = &f;
   };

   template <typename A> void execute(A const& a)
   {
     (func)(a);
   };
   template <typename A> void execute(A const& a,A const& b)
   {
     (func)(a,b);
   };
   template <typename A> void execute(A const& a,A const& b,A const& c)
   {
     (func)(a,b,c);
   };
};

答案 1 :(得分:1)

您可能希望使用Boost::FunctionTypes提供能够分解函数类型的元函数,并允许您访问返回或参数类型。

答案 2 :(得分:1)

在C ++ 0x中,你可以decltype。但是,在C ++ 03中,按照惯例,函数对象具有result_type typedef,函数指针可以应用模板推导。