从参数类型(而不是参数)中推断函数模板的返回类型

时间:2017-11-16 14:00:33

标签: c++11 templates decltype

我知道decltype非常直接的使用,如

template<typename T, typename F>
auto myfunc(T elem, F func) -> decltype(func(elem)) 
{
    return func(elem);
}   

我想知道函数的返回类型是否可以在不引用函数参数的情况下推导出来,而是引用参数类型,即类似于decltype(func, T)的东西?

据我所知,在这种情况下,一个是一个类型而另一个是一个对象,但我想要做的似乎是非常自然的。然而,我没有找到一种表达我想要的简单方法。有什么帮助吗?

谢谢。

1 个答案:

答案 0 :(得分:3)

这正是std::declval的用途:

template<typename T, typename F>
auto myfunc(T elem, F func) -> decltype(func(std::declval<T>())) 
{
    return func(elem);
}

但是既然你已经拥有了那种类型的对象,为什么还要费心呢?