在 C++20 NTTP 和类型之间转换
Convert between C++20 NTTP and type
我正在研究 C++20 NTTP(非类型模板参数),我想知道,有没有办法在 NTTP std::array
的元素和T<int>
?
的形式
考虑这个例子:
template<int X>
struct Func;
template<auto ints>
struct Foo{
// This doesn't work because within the std::apply the ints isn't a constant expression.
constexpr auto funcs() const {
return std::apply([](auto... xs){ return std::tuple{Func<xs>{}...};}, ints);
}
};
constexpr Foo<std::array{1,2,3}> f;
constexpr auto funcs = f.funcs();
如果元素是可变 NTTP 包中的值,它很容易工作,但将它们放在 std::array
中将允许使用标准库算法的全部功能,而不必通过以下方式对参数包进行操作TMP(模板元编程)。
template<int... ints>
struct Foo2{
// This here works, of course.
constexpr auto funcs() const {
return std::tuple{Func<ints>{}...};
}
};
constexpr Foo2<1,2,3> f2;
constexpr auto funcs = f2.funcs();
完整代码here.
您可以使用 std::index_sequence
方法获取包含 ints
数组索引的参数包作为模板参数包:
return []<std::size_t... I>(std::index_sequence<I...>){
return std::tuple{Func<ints[I]>{}...};
}(std::make_index_sequence<std::size(ints)>{});
然后 ints[I]
就可以完全按照您打算 xs
在您的示例中使用。
我正在研究 C++20 NTTP(非类型模板参数),我想知道,有没有办法在 NTTP std::array
的元素和T<int>
?
考虑这个例子:
template<int X>
struct Func;
template<auto ints>
struct Foo{
// This doesn't work because within the std::apply the ints isn't a constant expression.
constexpr auto funcs() const {
return std::apply([](auto... xs){ return std::tuple{Func<xs>{}...};}, ints);
}
};
constexpr Foo<std::array{1,2,3}> f;
constexpr auto funcs = f.funcs();
如果元素是可变 NTTP 包中的值,它很容易工作,但将它们放在 std::array
中将允许使用标准库算法的全部功能,而不必通过以下方式对参数包进行操作TMP(模板元编程)。
template<int... ints>
struct Foo2{
// This here works, of course.
constexpr auto funcs() const {
return std::tuple{Func<ints>{}...};
}
};
constexpr Foo2<1,2,3> f2;
constexpr auto funcs = f2.funcs();
完整代码here.
您可以使用 std::index_sequence
方法获取包含 ints
数组索引的参数包作为模板参数包:
return []<std::size_t... I>(std::index_sequence<I...>){
return std::tuple{Func<ints[I]>{}...};
}(std::make_index_sequence<std::size(ints)>{});
然后 ints[I]
就可以完全按照您打算 xs
在您的示例中使用。