使用模板化Arity存储类函数

时间:2019-06-13 12:08:30

标签: c++ function lambda

我想拥有一个代表整数的离散函数的类。函数的功能是模板参数。构造函数应接受此指针的功能(指向吗?)。我还希望能够将lambda表达式传递给构造函数。实际上,这是我要传递的主要功能。

此外,我想有一种方法eval()来计算提供的参数的函数值。

问题是如何传递和存储函数以及如何对其求值。

template<int arity>
class DiscreteFun {
private:
    FuncType f; // what should FuncType be?
public:
    DiscreteFun(FuncType f): f(f) { };

    int eval(const array<int,arity>& x) const {
      // how to pass arguments so that it calculates f(x[0], x[1], ...)
    }
};

2 个答案:

答案 0 :(得分:3)

您可以为f类型添加模板参数,然后eval就是std::apply。请注意,std::array是一个类似元组的容器。

template<int arity, typename FuncType>
class DiscreteFun {
private:
    FuncType f;
public:
    DiscreteFun(FuncType f): f(f) { };

    int eval(const array<int,arity>& x) const {
        return std::apply(f, x);
    }
};

template<int arity, typename FuncType>
DiscreteFun<arity, FuncType> makeDiscreteFun(FuncType&& f)
{
    return { std::forward<FuncType>(f) };
}

答案 1 :(得分:2)

您可以使用Sub MacroNo(r As Range) Range("L" & r.Row).Validation.Delete Sheets("Data").Range("L" & r.Row).Resize(, 2).Value = "NA" End Sub 和一些间接方式:

std::index_sequence