如何以constexpr方式调用具有元组输入的模板静态类方法

发布于 2025-01-23 15:55:02 字数 951 浏览 0 评论 0原文

How can a static constexpr class::method (int i1, int i2, int i3) be invoked, having input data available as tuple in一种constexpr方式。

默认方法使用 std :: apply 将每个元组应用于参数到一个函数。

一个可视化的最小示例,我尝试实现的样子是:

struct a {
    template <typename T>
    static constexpr void test(int i1, int i2, int i3) {
        // ...
    }
};

struct b : a {};
struct c {};

template <typename T>
struct test_functor {
    constexpr test_functor_t() {} // just for testing to express constexpr desire
    constexpr void operator()(auto... args) {
        T::test<c>(args...);
    }
};

constexpr std::tuple<int, int, int> tupl{ 1,2,3 };
constexpr test_functor<b> f;
std::apply(f, tupl);

这在运行时起作用,但无法编译constexpr。如何实施?

How can a static constexpr class::method (int i1, int i2, int i3) be invoked, having input data available as tuple<int, int, int> in a constexpr way.

The default approach is using std::apply to apply each tuple element as argument to a function.

A minimal example to visualize, what I try to achieve looks like:

struct a {
    template <typename T>
    static constexpr void test(int i1, int i2, int i3) {
        // ...
    }
};

struct b : a {};
struct c {};

template <typename T>
struct test_functor {
    constexpr test_functor_t() {} // just for testing to express constexpr desire
    constexpr void operator()(auto... args) {
        T::test<c>(args...);
    }
};

constexpr std::tuple<int, int, int> tupl{ 1,2,3 };
constexpr test_functor<b> f;
std::apply(f, tupl);

this works at runtime, but fails to compile constexpr. How can this be implemented?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

往日情怀 2025-01-30 15:55:02

工作test_functor

template <typename T>
struct test_functor {
    constexpr void operator()(auto... args) const {
        T::template test<c>(args...);
    }
};

问题:

  1. 您的构造函数被错误命名,最终是不必要的 - 没有构造函数,您的类型是汇总的,可以constexpr - 构造很好。
  2. 您的operator()不是const - 主要问题,因为您无法在constexpr上调用非 - const成员对象。
  3. 缺少template调用t :: test - 请参阅此FAQ答案可以很好地解释依赖名称。

在线demo

Working test_functor:

template <typename T>
struct test_functor {
    constexpr void operator()(auto... args) const {
        T::template test<c>(args...);
    }
};

The problems:

  1. Your constructor was misnamed, and ultimately unnecessary – without a constructor your type is an aggregate and can be constexpr-constructed just fine.
  2. Your operator() was not const – the primary problem, as you can't invoke a non-const member on a constexpr object.
  3. Missing template keyword when invoking T::test – see this FAQ answer for a good explanation of dependent names.

Online Demo

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文