如何以 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...);
}
};
问题:
- 你的构造函数命名错误,最终是不必要的——没有构造函数,你的类型就是一个聚合,可以
constexpr
构造得很好。
- 您的
operator()
不是 const
– 主要问题,因为您不能在 constexpr
对象上调用非 const
成员。
- 调用
T::test
时缺少 template
关键字 – 请参阅 this FAQ answer 以了解相关名称的详细解释。
如何调用 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...);
}
};
问题:
- 你的构造函数命名错误,最终是不必要的——没有构造函数,你的类型就是一个聚合,可以
constexpr
构造得很好。 - 您的
operator()
不是const
– 主要问题,因为您不能在constexpr
对象上调用非const
成员。 - 调用
T::test
时缺少template
关键字 – 请参阅 this FAQ answer 以了解相关名称的详细解释。