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

时间:2018-05-09 18:14:04

标签: c++ c++11 templates callback constexpr

我正在使用一个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和运行时生成的lambda?

2 个答案:

答案 0 :(得分:4)

作为浮动aren't allowed as template non-type parameters,,您必须将它们作为实际的函数参数而不是模板参数。

如果你想拥有一个只接受一个参数的函数,你可以通过直接返回lambda来避免 <br> <%String id = request.getParameter("track_id");%> <%if (id.length() == 0) {%> <b><h1>Please Enter Tracking ID</h1></b> <% } else {%> <div class="container"> <table border="1" class="table" > <thead> <tr class="warning" > <td ><h4>Track ID</h4></td> <td><h4>Source</h4></td> <td><h4>Destination</h4></td> <td><h4>Current Status</h4></td> </tr> </thead> <% try { connection = DriverManager.getConnection(connectionUrl + database, userid, password); statement = connection.createStatement(); String sql = "select * from track where track_id="+ id; resultSet = statement.executeQuery(sql); while (resultSet.next()) { %> <tr class="info"> <td><%=resultSet.getString("track_id")%></td> <td><%=resultSet.getString("source")%></td> <td><%=resultSet.getString("destination")%></td> <td><%=resultSet.getString("status")%></td> </tr> <% } connection.close(); } catch (Exception e) { e.printStackTrace(); } %> </table> <%}%> </body> 的代价。如果我们使用C ++ 14,您可以让它返回std::function

auto

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

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);
    };
}

答案 1 :(得分:2)

  

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

如果您可以将静态全局变量作为模板参数而不是float文字传递,则可以通过引用传递它们

以下内容

#include <iostream>

template <typename T, T const & min, T const & max>
constexpr bool in_range (T val)
 { return (val >= min && val <= max); }

static constexpr float  f0 { 0.0f };
static constexpr float  f1 { 1.0f };

int main ()
 {    
   static_assert(in_range<float, f0, f1>(0.5f), "!");
 }