[英]How can I overload a lambda function with a variadic number of parameters?
我正在使用此答案中提出的解決方案從 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 特性,比如 if 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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.