【发布时间】:2019-01-09 06:59:37
【问题描述】:
所以我制作了这个模板来内联定义函子:
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>
但它们都是编译错误,因为 lambdas 不能出现在未评估的上下文中。
【问题讨论】:
-
如果有记忆,它们也不能作为模板参数出现。我不知道你的原作是如何工作的。
-
我没记错。 GCC 将其拒绝为 c++17 coliru.stacked-crooked.com/a/e1ac1398a09c3b35
-
哎呀,我忘了一个右尖括号。再试一次。
-
奇怪,MSVC 接受了它:godbolt.org/z/S1F_5u 虽然这个功能似乎在技术上被推回了 c++2x。