有没有办法找出函数的返回类型(甚至更好的函数指针)是什么?
我有以下代码,当我使用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);
但在两种情况下都失败了。
实例化时的第二个模板参数用于定义返回类型。
答案 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,函数指针可以应用模板推导。