我正在使用建议的解决方案in this answer从lambda函数获取参数,并且在参数数量固定的情况下可以正常工作。我首先创建了一个带有一个参数的变体,并想添加第二个接受两个参数的变体。我不希望将其概括,只是下面的两个选项。
class MyClass {
template<typename Lambda>
typename std::enable_if<function_traits<Lambda>::arity, 1>>
void Each(Lambda lambda) {
using Traits = function_traits<decltype(lambda)>;
using Arg0 = typename Traits::template arg<0>::type;
lambda(Conv<Arg0>().ToType(this));
}
template<typename Lambda>
typename std::enable_if<function_traits<Lambda>::arity, 2>>
void Each(Lambda lambda) {
using Traits = function_traits<decltype(lambda)>;
using Arg0 = typename Traits::template arg<0>::type;
using Arg1 = typename Traits::template arg<1>::type;
lambda(Conv<Arg0>().ToType(this), Conv<Arg1>().ToType(this));
}
}
void main() {
MyClass myClass;
myClass.Each([](int arg) {});
myClass.Each([](int arg0, int arg1) {});
}
这段代码当然根本不会编译,但是我仍然不明白enable_if的工作原理。我正在使用GCC 6.2.0,因此不能使用C++ 17功能(如constexpr),否则我会使用它。正确的实现在这里看起来像什么?
最佳答案
假设已定义Conv
class MyClass {
public:
template<typename Lambda>
typename std::enable_if<(function_traits<Lambda>::arity == 1), void>::type
Each(Lambda lambda) {
using Traits = function_traits<decltype(lambda)>;
using Arg0 = typename Traits::template arg<0>::type;
lambda(Conv<Arg0>().ToType(this));
}
template<typename Lambda>
typename std::enable_if<(function_traits<Lambda>::arity == 2), void>::type
Each(Lambda lambda) {
using Traits = function_traits<decltype(lambda)>;
using Arg0 = typename Traits::template arg<0>::type;
using Arg1 = typename Traits::template arg<1>::type;
lambda(Conv<Arg0>().ToType(this), Conv<Arg1>().ToType(this));
}
};
int main() {
MyClass myClass;
myClass.Each([](int arg) {});
myClass.Each([](int arg0, int arg1) {});
return 0;
}
关于c++ - 如何重载带有各种参数的lambda函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59597443/