2015-06-21 29 views
2

我有一个模板参数接受另一个函数的函数。在这个函数中,我想调用一个不同的模板函数,它需要使用函数参数的返回类型实例化。确定作为模板参数给出的函数的返回类型

因为我可能搞砸最后一段,让我尝试用一​​个例子来阐明:

template <typename funT> 
void foo(funT function_to_call) 
{ 
    auto data = bar<funT::return_value>(); 
    /// do some stuff with data. 
    /// call function_to_call, but bar needed to be called first. 
} 

如何获得凡特:: RETURN_VALUE?

非常感谢,

+0

这个问题已经被市场视为一个不相关的市场的副本,不是吗? – rems4e

+0

是的,就我所知,答案与我的问题无关,除非它们都与C++模板有关。 – Spacemoose

+0

无论如何,只要'funT'不带任何参数,您可以使用'std :: result_of :: type'来访问返回类型。 – rems4e

回答

1

你可以使用特别std::result_of型性状的方式如下:

template <typename funT> 
void foo(funT function_to_call) { 
    auto data = bar<typename std::result_of<decltype(function_to_call)&()>::type>(); 
    //... 
} 

LIVE DEMO

你也可以进一步推广到接受任何形式的功能,沿其通过使用可变参数模板以下列方式输入参数:

template <typename funT, typename ...Args> 
void foo(funT function_to_call, Args... args) { 
    auto data = bar<typename std::result_of<funT(Args...)>::type>(); 
    ... 
} 

LIVE DEMO

+2

这与仅使用'decltype(function_to_call())'有什么区别吗? – Alejandro

+0

@Alejandro是的,因为'decltype(function_to_call())'返回到'function_to_call'返回类型(例如'int')并且调用'std :: result_of :: type'会给你一个编译错误。 – 101010

+0

我只是在谈论用'decltype(function_to_call())'替换'typename std :: result_of :: type''。事实上,它确实有效!看看[这个现场演示](http://coliru.stacked-crooked.com/a/c4b297ff50d458cf)。 – Alejandro

0

您可以使用typename std::result_of<funT()>::type满足您的需求,或者std::result_of_t<funT()>如果你有机会到C++ 14。

1

除了像其他人所建议的那样使用result_of之外,您还可以使用decltype

对于那些function_to_call不接受任何参数的情况下,你可以做到以下几点:

auto data = bar<decltype(function_to_call())>(); 

然而,一个更通用的情况下,作为@ 101010已经指出的那样,你可以有你的函数接受任何数目的参数。生成的代码是这样的:

template <typename funT, typename ...Args> 
void foo(funT function_to_call, Args&&... args) 
{ 
    auto data = bar<decltype(function_to_call(std::forward<Args>(args)...))>(); 
} 

的情况外,我已经试过了,decltypestd::result_of有关于如果传递函数类型返回正确的类型相同的功能不是指针正如@hvd所指出的那样。通过g ++来源看,std::result_of通常按decltype来实现,对于上述情况。

尽管C++ 14 std::result_of_t选项也非常有吸引力,对我来说,使用这个选项似乎比替代选项typename std::result_of<...>::type更清晰和更具可读性。

相关问题