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

How to invoke a templated static class method having tuple input in a constexpr way

如何调用 static constexpr class::method (int i1, int i2, int i3),以 constexpr 方式将输入数据用作 tuple<int, int, int>

默认方法是使用 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。如何实施?

工作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. 调用 T::test 时缺少 template 关键字 – 请参阅 this FAQ answer 以了解相关名称的详细解释。

Online Demo