首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用模板化的arity存储在类函数中

使用模板化的arity存储在类函数中
EN

Stack Overflow用户
提问于 2019-06-13 20:08:30
回答 2查看 63关注 0票数 1

我希望有一个类来表示整数上的离散函数。函数的实参是一个模板参数。构造函数应该接受(指向?)的函数。我还希望能够将lambda表达式传递给构造函数。事实上,这是我将要传递的主要函数类型。

此外,我希望有一个eval()方法来计算所提供参数的函数值。

问题是如何传递和存储函数,以及如何计算它。

代码语言:javascript
复制
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], ...)
    }
};
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-13 20:46:22

您可以使用std::index_sequence和一些间接的方法:

代码语言:javascript
复制
template <std::size_t, typename T>
using always_t = T;

template <typename Seq> class DiscreteFunImpl;

template <std::size_t ... Is>
class DiscreteFunImpl<std::index_sequence<Is...>>
{
private:
    std::function<int (always_t<Is, int>...)> f;
public:
    DiscreteFunImpl(std::function<int (always_t<Is, int>...)> f): f(f) {}

    int eval(const array<int, sizeof...(Is)>& x) const {
        return f(x[Is]...);
    }
};


template <std::size_t N>
using DiscreteFun = DiscreteFunImpl<std::make_index_sequence<N>>;
票数 2
EN

Stack Overflow用户

发布于 2019-06-13 20:50:29

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

代码语言:javascript
复制
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) };
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56580149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档