【发布时间】:2018-05-09 18:14:04
【问题描述】:
我正在使用一个 API,它接受一个带有单个参数的函数作为回调。回调接受特定类型的单个参数,为了简单起见,我会说它返回一个bool。我试图组合的主要内容是范围检查功能。我的直觉是这样写:
template<class T, T min, T max>
constexpr bool in_range(T val) {
return (val >= min && val <= max);
}
static_assert(in_range<float, 0.0f, 1.0f>(0.5f), "doesn't work")
但是,这不起作用,所以我默认以这种方式创建函数。
template<class T>
std::function<bool(T)> in_range(T min, T max) {
auto test = [min, max](T val) {
return (val >= min && val <= max);
};
return test;
}
assert(in_range<float>(0.0f, 1.0f)(0.5f))
有没有办法以第一个函数的形式更多地编写函数,所以我不依赖std::function和运行时生成的lambdas?
【问题讨论】:
-
为什么不做
min和max函数参数呢? -
我应该澄清一下我是在 c++11 环境中运行的,所以不能选择自动返回值。
-
我还没有把它们变成函数参数,因为 API 只接受一个带有单个参数的回调。我可以在设置回调时只编写 lambda,但由于它可以多次重复使用,因此我希望这种模式简洁明了。
-
这里的问题是浮点类型被排除在函数模板之外吗?您能否为 2 个值参数为双精度值的浮点数编写替代规范?
-
您确定您正在运行 C++11 环境吗?在您的示例中,您编写了一个
static_assert()没有错误消息,如果我没记错的话,它是 C++17 功能。
标签: c++ c++11 templates callback constexpr