gpt4 book ai didi

c++ - 创建一个像 std::integral_constant 这样的容器

转载 作者:太空狗 更新时间:2023-10-29 20:21:44 24 4
gpt4 key购买 nike

我想创建一个 std::integral_constant 的“容器版本”。这是一个用元素类型和非类型参数参数化的类型:

enum class A {
a = 1 << 0,
b = 1 << 1,
c = 1 << 2
};

template<typename T, T... Values>
struct static_container final {};

template<typename T, T... Ts>
constexpr auto make_static_container(T...) { // wrong
return static_container<T, Ts...>{};
}

template<typename F, F... FF>
void inline set(static_container<F, FF...>) {
std::cout << sizeof... (FF) << std::endl;
}

int main() {
constexpr static_container<A, A::a, A::b> sc1{}; //ok
constexpr auto sc2 = make_static_container(A::a, A::c); // not-ok

set(sc1);
set(sc2);
}

在上面你可以看到我可以创建具有显式类型的 sc1

现在我喜欢有一个辅助函数来创建这样一个类型而不指定(冗余)枚举类型。

这里的输出是:

2
0

有什么提示吗?

最佳答案

作为您对 std::integral_constant 评论的跟进,这就是它的样子:

template<typename T, T... Values>
constexpr auto make_static_container(std::integral_constant<T, Values>...) noexcept {
return static_container<T, Values...>{};
}

由于函数现在占用 std::integral_constant<T>,因此必须更改调用站点s 而不是 T直接;它有点嘈杂,但可变模板使它不会痛苦:

template<A a>
using A_ = std::integral_constant<A, a>;

template<A a>
constexpr A_<a> a_{};

int main() {
// explicit construction via alias template:
constexpr auto sc1 = make_static_container(A_<A::a>{}, A_<A::b>{});
// implicit construction via variable template:
constexpr auto sc2 = make_static_container(a_<A::a>, a_<A::c>);

set(sc1);
set(sc2);
}

Online Demo

(顺便说一句,static_container::value 在演示 becomes unnecessary in C++17 中的单独定义。)

关于c++ - 创建一个像 std::integral_constant 这样的容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41724696/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com