我使用宏从旧C ++时代继承了这段代码。我目前正在替换它,现在是需要考虑一些结构的时候了。
通常,我有这个:
if(condition)
{
fun1(fun2(arguments, arg1)); // let's say arg1 is a vector of doubles
}
else
{
fun1(fun2(arguments, arg2)); // let's say arg2 is a double
}
几次。根据{{1}}参数类型,fun1()
有一组不同的参数,我在那里也可以有fun2()
和arg1
(实际的代码实际上有多层{{ 1}} s,每次都有不同的类型集,每个分支内又增加了几层功能。
我想在一个可以像这样的模板lambda的函数中考虑这一点:
arg2
现在,问题在于它是模板化的,因此我无法将其转换为if
,所以我不知道我应该使用哪种类型的参数来创建函数:
[&](auto arg) { fun1(fun2(arguments, arg));}
C ++ 17中是否有这样的选项?甚至是C ++ 20?
答案 0 :(得分:5)
现在,问题在于它是模板化的,因此我无法将其转换为
std::function
,所以我不知道我应该使用哪种类型的参数来创建函数
简单如下?
template <typename F>
void dispatch(bool condition, const std::vector<double>& arg1, double arg2, F lambda)
我的意思是……对于具有operator()
(如果是{{1}
通用lambda)。
因此,您可以仅通过类的模板类型来拦截lambda。
如果operator()
不可变,也许可以接受它作为const引用(F const & lambda
),以避免不必要的复制。
C ++ 17中是否有这样的选项?甚至是C ++ 20?
应该从C ++ 14开始工作。
在C ++ 14之前,通用lambda不可用(但是您可以用模板lambda
s的显式类替换它们)。