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;
}
总的来说,我在理解函子时遇到了一些困难,因为我对模板编程还很陌生。
我想在这里完成的是以下内容,我正在尝试拥有一个采用 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;
}