所以我制作了这个模板来内联定义函子:
template <typename F, F* f>
struct AsFunctor
{
template <typename... Args>
std::invoke_result_t<F, Args...> operator()(Args&&... args) { return f(std::forward<Args>(args)...); }
};
可以这样使用:
std::unique_ptr<char, AsFunctor<void(char*), +[](char* c) {/*STUFF*/}>> p;
很好,除了我不必两次声明函数的类型。有什么办法可以使编译器推断出来?我已经尝试过各种方式的decltype,例如
#define AS_FUNCTOR(lambda) AsFunctor<decltype(+lambda), +lambda>
但是它们都是编译错误,因为lambda不能出现在未评估的上下文中。
答案 0 :(得分:1)
可以将auto
用作函子,然后使用decltype
来推断类型。
template <auto F>
struct AsFunctor {
template <typename... Args>
std::invoke_result_t<decltype(F), Args...> operator()(Args&&... args) {
return F(std::forward<Args>(args)...);
}
};
int main() {
int i;
std::unique_ptr<char, AsFunctor<+[](char* c) { /*STUFF*/ }>> p;
}
我不知道上下文,但是通常您不需要任何自定义函子类型(最好立即使用模板,查看STL中的任何示例)或std::function
。