c++ - 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。
解决方案
是的,您可以使用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;
}
推荐阅读
- functional-programming - Elixir Enum.map vs For 理解
- arrays - 如何在 Swift 4.2 中创建数据类型泛型
- python - 如何使用 pyqt4 从过滤(列表视图)中获取正确的单词
- c# - IBM PCOMM Emulator,通过 COM/C# 接口访问选定文本
- reporting-services - RDLC Reportviewer - 在单个页面中显示每个子报告并删除空白页面
- android - 禁用列表视图中的某些项目后,分隔线消失
- kubernetes - GKE,对集群内的所有节点使用相同的 ip 或 ip 范围
- conv-neural-network - 暗网中YOLOv2网络中absolute、jitter、rescore和bias_match有什么用?
- ios - UIKit Dynamics 和 UIKit Animation 有什么区别?
- android - 从 OnItemSelectedListener 调用值