标题可能听起来令人困惑,但这里有一些代码可以清除它,
template<class Act>
auto ActWrapper(Act && act, std::mutex mutex) -> decltype(act())
{
//....
return act();
}
如何编写上述函数的函数指针?
答案 0 :(得分: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>;
答案 1 :(得分:0)
如何编写上述函数的函数指针?
您不能声明指向函数模板的函数指针。您只能声明一个函数指针。
如果Foo
是ActWrapper
的有效类型,则可以声明指向ActWrapper<Foo>
的函数指针。那时你会知道函数的返回类型,你可以使用它。
using returntype = <the return type of Foo::operator()>;
using FuncionPtrType = returntype (*)(Foo&&, std::mutex);
FuncionPtrType functionPtr = ActWrapper<Foo>;
答案 2 :(得分:0)
当其他人拥有pointed out时,你不能创建一个指向整个函数集的简单函数指针,只能指向模板的特定实例。
如果你需要一些东西可以传递给整个集而不是特定的函数,你需要将它包装在一个lambda或一个operator()
的类中,然后传递它。