首页 > 解决方案 > C++ 区分 Functor 和 Value 模板参数

问题描述

一般来说,我在理解函子时遇到了一些麻烦,因为我对模板编程还很陌生。

我在这里想要完成的是以下内容,我试图拥有一个接受 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。

标签: c++templatesfunctoroverloading

解决方案


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

推荐阅读