第一个模板类型的模板参数

dfr*_*ese 5 c++ templates callback constexpr c++11

我正在使用一个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")
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用,所以我默认以这种方式创建一个函数.

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))
Run Code Online (Sandbox Code Playgroud)

有没有办法以第一个函数的形式更多地编写函数,所以我不依赖std::function于运行时生成的lambdas?

Jus*_*tin 4

由于不允许将浮点数用作模板非类型参数,因此您必须将它们作为实际函数参数而不是模板参数。

std::function如果你想要一个只接受一个参数的函数,你可以通过直接返回 lambda 来避免成本。如果我们使用 C++14,你可以让它返回auto

template<class T>
auto in_range(T min, T max) { // Note: could be `constexpr` in C++17
    return [min, max](T val) {
        return (val >= min && val <= max);
    };
}
Run Code Online (Sandbox Code Playgroud)

但是,由于您使用的是 C++11,因此必须手动写出可调用类型:

template <typename T>
class InRange {
public:
    constexpr InRange(T min, T max)
        : min(std::move(min))
        , max(std::move(max))
    {}

    constexpr bool operator()(T const& val) const {
        return (val >= min && val <= max);
    }

private:
    T min;
    T max;
};

template<class T>
constexpr InRange<T> in_range(T min, T max) {
    return InRange<T>(std::move(min), std::move(max));
}
Run Code Online (Sandbox Code Playgroud)