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

C++ distinguish Functor and Value template argument

总的来说,我在理解函子时遇到了一些困难,因为我对模板编程还很陌生。

我想在这里完成的是以下内容,我正在尝试拥有一个采用 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()

使用构造选择在调用选项时获取哪个参数的值。 (可能有一个额外的参数来确定是否选择该选项)

明确一点,一旦这个选项调用完成,它就知道是否对表达式求值。

此外,如果参数重载了 () 运算符,我想调用它,不管它是否也重载了 + 1。

是的,您可以使用 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;
}