【发布时间】:2013-04-04 08:38:58
【问题描述】:
我有以下问题。假设您想编写一个可以采用 lambda 表达式的通用函数。我知道如果参数的类型是 std::function,那么我不仅可以使用 lambda,还可以使用函数,甚至可以使用指向函数的指针。所以第一步,我做了以下事情:
void print(std::function<void(int, int)> fn) {
fn(1,2);
}
int main() {
print([](int i, int j) { std::cout << j <<','<<i<<'\n'; });
return 0;
}
现在的问题是我想让这个函数通用,这意味着我不希望 lambda 表达式只有两个参数。 所以我尝试将 print 函数的签名更改为更通用的东西,例如:
template <class function_type>
void print(function_type fn);
但现在的问题是该函数接受任何对象,我对此并不满意。 但主要问题是,我不知道对象 fn 可以接受多少个参数。
因此,在某种程度上,我正在寻找一种编译时方法来确定 fn 有多少个参数,并在可能的情况下将 fn 的类型更改为 std::function。然后,鉴于我知道 fn 接受的参数数量,是否有一种通用方法可以打包任意数量的参数以传递给 fn?我什至不知道这在 C++11 中是否可行。我的意思是,考虑到参数的数量,有没有办法打包参数以传递给 fn?所以如果有两个参数,那么我会调用
fn(arg1, arg2);
如果有三个:
fn(arg1, arg2, arg3);
等等。
感谢大家的见解。
啊
【问题讨论】:
-
你希望如何为不同的函数实现这个?
-
你要为参数传递什么值?
-
我将只传递整数类型,并且都一样。但是该类是由参数数量模板化的。
-
模板化了什么类?您的问题中没有课程。
-
因为我简化了代码来解释问题。我所拥有的是一个可以通过传递函子或 lambda 表达式来构造的对象。例如,这个对象是由一个维度模板化的,所以如果它是一维的,那么我必须只用一个参数调用函子,如果它是二维的,有两个参数等等......
标签: c++ c++11 lambda template-meta-programming generic-programming