推导(非)模板类型的签名

时间:2014-08-15 11:17:31

标签: c++ templates c++11

我对编写模板元编程相对较新,这可能是我无法找到解决此问题的方法的原因。问题是这样的:我正在开发一个数学库,它有很多函数,比如确定整数或std :: initializer_list的优先级,将整数改为罗马数字等等。当我尝试实现一个返回函数调用结果的泛型函数时,瓶颈开始了:

apply( foo, 1 ) === foo( 1 );

对于模板功能,如果它是这样写的,那就不会有任何意义:

apply( foo<int, int, int...>, 1, 2, 3... ); //Case 1
apply<int, int, double...>( foo, 1, 2, 3...) // Case 2
//OR whichever flavours the (closure object or ) callable has.

所以我决定编写 apply ,这样就不必看起来像上面那些直接丑陋的代码(确切地说案例2 )。我首先登陆here,然后我认为这是不正确的,然后我再次重写here

现在,我没有想法,我知道我可以在应用中使用 std :: function ,但我不知道想要使用它,除非没有别的办法。请不要误解我的意思,我不是说std​​ :: function在这里不适用,我只是说我会,当且仅当我没有其他选择时

注意:数学库是一个侧面项目,我用它来教我的大学伙伴C ++如何做事情,因此我对一些高级概念的使用较少。

1 个答案:

答案 0 :(得分:3)

这里的apply实现适用于函数指针或可调用类,如lambda和推导模板参数:

#include <type_traits>
#include <utility>

template<class Fun, class... Args>
typename std::result_of<Fun(Args...)>::type
apply(Fun&& fun, Args&&... args)
{
    return fun(std::forward<Args>(args)...);
}