template-meta-programming 相关问题

模板元编程是一种元编程技术,其中编译器使用模板生成临时源代码,该代码由编译器与其余源代码合并然后编译。

访问 std::variant 时获取其编译时索引?

我有一个可能重复类型的 std::variant,我想增加该变体的活动索引。 这是一个演示我想做的事情的示例: 模板 我有一个 std::variant 可能重复的类型,我想增加变体的活动索引。 这是一个演示我想做的事情的示例: template <typename... Ts> bool update_variant(std::variant<Ts>& v, std::tuple<work_generator<Ts>>& gen) { return visit_with_index([&]<size_t Index /* the active index */>(auto& e) { if (e.done()) { // we are done with e constexpr size_t next_index = Index + 1; if constexpr (next_index == sizeof...(Ts)) { // no more other work to do return false; } else { // still have other work to do so we move on to the next variant alternative v.emplace( std::in_place_index_t<next_index>{}, std::get<next_index>(gen).create_worker() ); return true; } } else { // do some work on e, so e gets closer to the done state e.do_some_work(); return true; } }, v); } 为了实现这一点,我似乎需要类似于上面visit_with_index的东西,它为我提供当前索引作为编译时值。 除了上面编写我自己的 visit_with_index 版本(实际上是编写我自己的 std::visit 版本)之外,还有其他更简单的方法可以实现我想要的功能,而无需通过索引执行多次查找吗? 我会在索引上使用 visit “直接”。 第一 template <typename... Ts> auto get_index_variant(const std::variant<Ts...>& v) { return [&]<std::size_t...Is>(std::index_sequence<Is...>){ using Ret = std::variant<std::integral_constant<std::size_t, Is>...>; std::array<Ret, sizeof...(Is)> a = {{Ret{std::integral_constant<std::size_t, Is>{}}...}}; return a[v.index()]; }(std::make_index_sequence<sizeof...(Ts)>()); } 然后 std::visit([&](auto index){ // index() is constexpr // ... }, get_index_variant(v)); 演示

回答 1 投票 0

如何将类型推导与函数参数声明分开?

如果我的函数 foo 按值而不是通用(转发)引用接受原始类型,我的应用程序会显着加速。然而,如果不是主要的,加速就会丢失......

回答 1 投票 0

如何在不添加额外副本的情况下拆分可变参数模板参数?

考虑以下 C++23 代码: #包括 #包括 #包括 结构W1 { 整数 n; 布尔b; W1(int x, bool f) : n(x), b(f) {} }; 结构W2 {...

回答 1 投票 0

如何在 C++11 (STL) 中创建一个压缩两个元组的函数?

我最近遇到了这个难题,终于能够找到一个黑客答案(使用索引数组),并想分享它(答案如下)。我确信有使用模板递归的答案......

回答 3 投票 0

是否有一个C++20概念,当使用某个库中的函数时会调用该概念?

我希望对某个库中的函数的所有调用都包含对我的函数的调用。 例如,每当调用库 中的函数时,我的函数 log() 都是...

回答 1 投票 0

使用C++元编程,如何判断你是在类方法中还是静态/全局函数中?

有没有办法确定当前作用域是全局函数/静态类方法还是类方法? 我想到了这个的存在,但我找不到一种不存在的技术

回答 1 投票 0

一组相关类型的类型特征的设计注意事项

C++ 标准库提供了 std::char_traits 来统一字符数据的处理,而不考虑所使用的具体字符类型。 它还提供 更多

回答 1 投票 0

C++0x TMP 编译速度

这个问题重点关注模板元编程结构。我发现两篇文章(一篇和两篇,两篇没有提供确凿的证据,但我相信这些说法)提供了证据表明......

回答 1 投票 0

std::integer_sequence

我已经开始使用这种类型的构造,它依赖于 C++20 的 lambda 显式模板参数: 模板 结构体Foo { std::tuple 条; 自动

回答 1 投票 0

std::tuple_element的编译时间复杂度(即编译器的运行时间复杂度)<N, TupleType>

假设在我的代码中我有以下行: 使用 T = std::tuple_element 其中 TupleType 是一个非常大的元组的类型,N 是一个非常大的数字(比如 1,000,000) 我明白了...

回答 1 投票 0

两个复杂的requires子句的解释

这篇文章讨论了一个计算类中成员数量的方法: struct UniversalType { 模板 运算符 T(); }; 模板 保守...

回答 1 投票 0

如何交错 C++ 模板参数包

我有这个c++模板函数 模板 无效一些func(){ // 做工作... } ,我可以这样称呼: somefunc<1, true, 2, false>(); 我想退出...

回答 1 投票 0

编译时多项式

我(终于)最近听说了可变参数模板。我想知道是否有一种方法可以使用编译时运算符创建 int - 多项式: 模板 结构多项式 {}

回答 3 投票 0

for 语句中的 constexpr

c++17 提供了 if constexpr,其中: condition 的值必须是根据上下文转换的 bool 类型常量表达式。如果值为 true,则丢弃语句 false(如果存在...

回答 4 投票 0

容器类型的C++工厂,无需定义容器元素类型

基于这个主题,我想知道是否可以有一个工厂类来提供容器类型,而不需要定义容器元素的类型。 像这样的东西: 模板<

回答 1 投票 0

尝试在旧代码中用新的 boost 替换旧的 boost 并得到错误,“type”:不是 boost::mpl::eval_if 的成员

我尝试用新版本的 boost 1.86 来编译使用非常旧的 boost 版本(比如 1.30 之类的)的旧代码(~15 年前 - luabind)。 我用 eval_if 替换了一些 apply_if 用法,就像建议的那样......

回答 1 投票 0

将大括号括起来的初始值设定项列表和向量的组合传递给可变参数模板

我想编写一个表类,它以多列作为参数来创建表。这是我的尝试。 模板 班级表 { 私人的: 使用类型=...

回答 1 投票 0

使用 SFINAE 对 std::variant 进行 Constexpr 检查

是否可以定义一个函数,通过 std::variant 的专门化来检查其模板化参数,而不实际包含 ?当然是为了

回答 1 投票 0

运行时在类之间进行选择以进行实例化

我想构造一个在运行时根据枚举类值选择的类型的对象。 A 类和 B 类有多个带有不同数量参数的构造函数,可以使用......

回答 1 投票 0

如何使用enable_if使用不定参数进行模板特化

我想要实现的目标 动机是我想要一个带有表单的模板 模板 其中 T 是某种类类型。我想要这个模板的专门版本...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.