如何限制我的模板仅接受具有特定输入和输出类型的 lambda?

问题描述 投票:0回答:2

受到计算函数泰勒级数的其他问题的启发(原始问题),我编写了一个没有任何约束的模板来成功计算总和。这是当前代码(模板主体已删除,正如 @Elliott 所说,这与要点无关..):

#include <iostream>
#include <cmath>
#include <limits>

template<typename ftn>
long double Taylor_sum(ftn terms_to_sum) { /* Summation calculation goes here... */ return result; };

int main(){
    using namespace std; long double x;  cin >> x ;
    long double series_sum = Taylor_sum([x](unsigned long long int i) -> long double { return /*Taylor term here*/; });
    if (!isfinite(series_sum)) cout << "Series does not converge!" << endl;
    else {
        cout << "Series converged, its value is : " << series_sum << endl;
        cout << "Compared to sin                : " << sinl(x) << endl;
    }
}

虽然代码足够工作,但为了自己学习和练习

concept
,我试图限制模板仅接受 lambda,以
unsigned long long int
作为输入,以
long double
作为输出。这是我当前的尝试(无法编译):

template<typename T,integral ARG>
concept my_lambda = requires(T t, ARG u) {
    { return t(u); };
}

template<my_lambda ftn>
long double Taylor_sum(ftn term) { //The rest is same...

我用 google 搜索了各种来源,但在我看来,因为

concept
是 C++20 中相对较新的功能,所以可用的材料似乎较少。有谁知道如何正确限制我的模板参数?

c++ templates generics c++20 c++-concepts
2个回答
6
投票

我试图限制模板只接受 lambda

unsigned long long int
作为输入,
long double
作为输出。

您可以将复合要求返回类型要求一起使用:

template<typename F>
concept my_lambda = requires(F f, unsigned long long int x) {
    { f(x) } -> std::same_as<long double>;
};

template<my_lambda ftn>
long double Taylor_sum(ftn term) { //The rest is same...

演示


0
投票

对我来说,使用 std::convertible_tostd::function 的解决方案看起来非常简洁:

template<typename T>
concept my_lambda = std::convertible_to<std::function<long double(unsigned long long)>, T>;

template<my_lambda Callback>
long double Taylor_sum(Callback&& term) { /*...*/ }
© www.soinside.com 2019 - 2024. All rights reserved.