总的来说,我对函子的理解有些困难,因为我对模板编程还很陌生。
我要在这里完成的工作如下,我试图拥有一个使用Functor的函数和一个使用值的重载函数。
理想情况:
template<typename ValueType>
int function(ValueType v)
{
v + 1;
...
}
template<typename Functor>
int function(Functor f)
{
f();
...
}
我可以通过以std :: function作为参数来提高性能,但是我特别希望能够将lambda作为参数。
编辑
我要实现的目标是在需要时允许正在构建的构造具有惰性评估:
construct.option(1)
construct.option([](){ return 5;})
construct.value()
通过构造选择在调用option时要获取哪个参数的值。 (可能带有一个额外的参数来确定是否选择了该选项)
要清楚,此选项调用完成后,它将知道是否对表达式求值。
如果参数重载()运算符,我也想调用它,无论它是否重载+ 1。
答案 0 :(得分:6)
是的,您可以使用SFINAE来做到这一点:
// overload taking functor f(int)
template<typename Func>
std::result_of_t<Func(int)> // or std::invoke_result_t<> (C++17)
function(Func const&func)
{
return func(0);
}
// overload taking value of builtin arithmetic type
template<typename ValueType>
enable_if_t<std::is_arithmetic<ValueType>::value, ValueType>
function(Value const&val)
{
return val;
}