C ++区分Functor和Value模板参数

时间:2018-08-07 11:41:57

标签: c++ templates functor overloading

总的来说,我对函子的理解有些困难,因为我对模板编程还很陌生。

我要在这里完成的工作如下,我试图拥有一个使用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。

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;
}