我有以下C ++代码:
template <class T1, class T2, class T3>
void MetaTypeHandler(T1 lambda1, T2 lambda2, T3 lambda3) {
lambda1(1);
lambda2('x');
lambda3(true);
}
int main() {
auto f = [] (auto x) {};
MetaTypeHandler(f,f,f);
}
多次传递f
是很丑的。是否可以编写MetaTypeHandler()
以便f
仅被传递1或2次?我认为模板模板参数可能会有所帮助,但无法绕过它们。
答案 0 :(得分:5)
我不明白问题所在。
这是通用 lambda。
基本上是其中带有模板 operator()
的结构的对象。
因此您只能一次通过它,并将其与所需的所有类型一起使用
#include <iostream>
template <typename T>
void MetaTypeHandler (T lambda)
{
lambda(42);
lambda('x');
lambda("abc");
lambda(true);
}
int main()
{
MetaTypeHandler(
[](auto const & x){ std::cout << "x is " << x << std::endl;});
}
答案 1 :(得分:2)
您可以提供一个超载:
#include <iostream>
template <class T1, class T2, class T3>
void MetaTypeHandler(T1 lambda1, T2 lambda2, T3 lambda3) {
lambda1(1);
lambda2('x');
lambda3(true);
}
template <class T>
void MetaTypeHandler(T lambda)
{
MetaTypeHandler(lambda, lambda, lambda);
}
int main() {
auto f = [] (auto x) {std::cout << x << std::endl;};
MetaTypeHandler(f);
}
因此,您可以传递3个不同的处理程序,也可以传递一个处理程序执行3次。