2015-06-10 54 views
3

我正在编写一个模板函数,该函数接收一个std::function对象(通过使用正确的参数调用std::bind生成)。 在这个函数中,我想确定这个函数对象的返回类型。有可能吗?确定std :: function的返回类型

事实上,我希望模板函数返回相同的类型。你能想到一个优雅的,基于标准的,实现这一目标的方式吗?

喜欢的东西:

template <typename T> 
T::return_type functionObjWrapper(T functionObject) { 
    // ... 
    return functionObject(); 
} 

感谢

+0

'std :: bind'不会返回一个'std :: function' – Barry

+0

不,但它返回一个可调用的对象,这足以初始化一个'std :: function'。 – MSalters

回答

9

则可以使用decltype和尾随返回类型做:

template <typename T> 
auto functionObjWrapper(T functionObject) -> decltype(functionObject()) { 
    // ... 
    return functionObject(); 
} 
+0

只有C++ 14兼容! –

+2

@DavidHaim在GCC 4.7.2(不具有C++ 14模式)中使用C++ 11模式构建时可以正常工作。而且,尾随返回类型是C++ 11标准的一部分,就像'decltype'一样。 –

+1

@DavidHaim这是普通的旧C++ 11。在C++ 14中,可以完全删除尾随返回类型 – Barry

2

您正在寻找std::function<F>::result_type

template <typename F> 
typename std::function<F>::result_type 
functionObjWrapper(std::function<F> functionObject) { 
    // ... 
    return functionObject(); 
} 

std::function<F>::result_typetypename之前需要,因为这是一个依赖型名称。

0
template <class F> 
std::result_of_t<F&()> functionObjWrapper(F functionObject) { 
    // ... 
    return functionObject(); 
} 

std::result_of取得“看起来像函数调用”的类型表达式。然后它告诉你如果你用这个可调用类型和那些参数进行函数调用会发生什么。

如果你没有C++ 14,与typename std::result_of<?>::type更换std::result_of_t<?>,或者自己写:

template<class Sig> 
using result_of_t=typename std::result_of<Sig>::type; 

在许多C++ 11的实现,result_of甚至SFINAE友好。

我做F&()而不是F(),因为我们打算使用类型为F的非常量左值来执行调用。如果你的最后一行是std::move(functionObject)()std::forward<F>(functionObject)(),你应该做result_of_t<F()>

相关问题