2017-09-11 61 views
0

标题听起来令人困惑,但这里是一些代码,将其清除,如何函数指针声明一个模板函数返回类型依赖于模板类

template<class Act> 
auto ActWrapper(Act && act, std::mutex mutex) -> decltype(act()) 
{ 
    //.... 
    return act(); 
} 

如何将一个函数指针写入上述功能?

+2

以上不是函数,它是一个能够生成函数的函数模板。 –

+1

由于'std :: mutex'没有拷贝构造函数,这是否可以用有用的方式调用? –

回答

4

没有模板函数指针,如果这是你在找什么。如果你想有一个指向特定实例的函数指针,你需要确切地知道函数实例化的签名。

您可以随时与auto骗:

auto ptr = &ActWrapper<foo>; 

如果您不能使用auto,你需要知道的返回类型:

return_t(*ptr)(foo&&, std::mutex) = &ActWrapper<foo>; 
// or 
decltype(ActWrapper(std::declval<foo>(), {}))(*ptr)(foo&&, std::mutex) = &ActWrapper<foo>; 
0

如何编写一个函数指针以上功能?

您不能声明函数指针指向函数模板。你只能声明一个函数指针。

如果FooActWrapper的有效类型,则可以声明函数指针指向ActWrapper<Foo>。那时你会知道函数的返回类型,你可以使用它。

using returntype = <the return type of Foo::operator()>; 
using FuncionPtrType = returntype (*)(Foo&&, std::mutex); 
FuncionPtrType functionPtr = ActWrapper<Foo>; 
0

正如其他人pointed out,你不能让一个简单的函数指针一整套功能,只对模板的特定实例。

如果你需要传递一些东西来引用整个集合,而不是一个特定的函数,你需要将它包装在一个带有operator()的lambda或class中,然后传递它。

相关问题