variadic-templates 相关问题

可变参数模板是采用可变数量参数的模板。

Fold expression for a parameter pack with comma operator: How to add additional parameters when expanding the pack?

我想设计一个编译时字符串类 CTString,例如由字符串文字的参数包构造。这使用逗号折叠表达式(对于这个玩具示例,我尝试

回答 1 投票 0

C++ 如何在运行时以编程方式更改调用指令

在进入问题的细节之前,我想透露一下,这是作为一项研究任务交给我的,因此可能会也可能不会。简而言之,最终目标是上课,

回答 1 投票 0

c++:连接从模板参数生成的字符串文字

我想根据模板参数的变量数量的类型生成一个字符串文字。每种类型都应翻译成字符串文字(1 个或多个字符),然后是文字 ...

回答 0 投票 0

使用可变参数模板,模板本身带有可变参数?

可以制作一个可变模板模板,它本身带有可变参数吗? 如何明确/部分专门化此模板? //例如。以下内容有效的内容: 温度...

回答 0 投票 0

检查可变参数模板中没有重复类型的 C++ 概念

我正在尝试弄清楚如何编写一个概念来检查可变参数模板中是否没有重复的类型。 我知道我不能在其自身内递归地调用一个概念,但如果我可以的话......

回答 6 投票 0

多个模板相关参数

我不确定问题名称是否真的反映了我在这里问的问题,所以如果有更好的标题请告诉我。 我有一个代表一个值的类,可以通过...

回答 2 投票 0

我需要帮助创建基于可变模板类参数的函数类型声明

我想在可变模板类中创建一个函数类型声明。该函数需要接受模板参数列表对应的参数。我想弄清楚是否...

回答 2 投票 0

在可变参数模板中使用元组

我正在设计一个记录器。我会格式化它。我做了一个设计,我会预先确定格式字符串,然后将这些数据保存在一个元组中并将其打印到日志中。 下面的代码现在可以工作了,b...

回答 0 投票 0

访问另一个别名中的个别别名,这是一个带有折叠表达式的参数包

鉴于这种类型: 模板 结构 base_unit { 使用比率 = r; 使用符号 = s; }; 模板 结构派生单元{ 使用单位 = ...

回答 1 投票 0

C++ 中的 Zip 类(内部对象生命周期)

我在 C++ 中有以下 Zip 类,它的工作方式与 Python 的 zip 相同。 当我运行下面的代码时,我得到了这个输出: 1 | 11 2 | 22 3 | 33 1 | 11 | 0 <--- problematic 2 | 22 | 6.

回答 3 投票 0

你如何编写一个函数模板来确定两个任意变体是否持有相同的类型?

考虑以下函数来确定相同变体类型的变量是否持有相同的类型: #包括 #包括 模板...

回答 2 投票 0

模板、良构和零包长度规则

从上一个问题的公认答案中,我发现了一个我不知道的关于模板和格式良好的规则 如果出现以下情况,则程序格式错误,不需要诊断: [...] ……

回答 1 投票 0

使用 std::get 进行运行时索引

我正在尝试将变体向量可变地转换为向量元组(即,我想将以下代码分解为可变参数模板 std::variant)。 std::向量 我正在尝试将 vectors 的 variant 可变地转换为 tuples 的 vector(即我想将以下代码分解为可变参数模板 std::variant<Ts...>)。 std::vector<std::variant<float, int>> vector_of_variants; vector_of_variants.emplace_back(1); vector_of_variants.emplace_back(2.f); std::tuple<std::vector<float>, std::vector<int>> result; for (auto& el : vector_of_variants) { auto index = el.index(); std::get<index>(result).pushback(std::get<index>(el)); // error: index is runtime value } 但是,std::get<index>(result).pushback(std::get<index>(el)); 行显然行不通,我需要用一些 std::visit 之类的行为替换它(即生成行 tuple_size 次并在运行时委托)。 符合人体工程学的方法是什么? 假设您已保证变体中的相应索引和result 匹配,类似下面的内容应该适用于天真的实现。可能不是最好的表现: [&]<std::size_t... Is>(std::index_sequence<Is...>){ (index == Is && std::get<Is>(result).push_back(std::get<Is>(el)), ...); }(std::make_index_sequence<std::tuple_size_v<decltype(result)>>{});

回答 1 投票 0

处理一般情况下混合类型和非类型的可变参数模板

所以我正在尝试创建一个类型特征来说明两个“外部”类类型是否相同。 IE。 std::vector 与 std::vector 相同,我不关心任何内部参数...

回答 1 投票 0

С所有 add 函数在接下来的 2 个参数上

我有一个函数可以对两个元素进行一些算术运算,如下所示: 模板 类型添加(常量类型& a,常量类型& b) { // 一些逻辑 如果(!((b >= 0) &&...

回答 3 投票 0

Variadic 模板,完美转发到具有默认参数的函数

我一直在使用可变参数模板,它在 C 和 C++ 之间的接口中充当异常防火墙。该模板简单地接受一个函数,后跟 N 个参数并调用函数 insi ...

回答 1 投票 0

运行时如何获取std::variant包含的对象?

我正在尝试实现一个模板化的请求-响应日志类。 这是一个用法示例: 结构请求A { std::字符串数据; }; 结构 ResponseA { 内部代码; }; 结构请求B { ...

回答 1 投票 0

如何从具有同质模板类型参数的完美转发函数中提取模板类型?

我希望编写一个可变参数工厂函数来转发可变数量的参数(相同类型)以构建和填充 std::vector。但是我不确定如何提取元素......

回答 2 投票 0

并行迭代 2 个模板参数包

我开始实现一个非常灵活的里程表。它可能有几个磁盘,每个不同的磁盘上的值数量甚至不同。而且,作为扩展,甚至每个值的数据类型......

回答 2 投票 0

递归可变参数模板打印出参数包的内容

如何创建递归可变参数模板来打印参数包的内容? 我正在尝试这个,但它无法编译: 模板 如何创建递归可变参数模板来打印出参数包的内容? 我正在尝试这个,但它无法编译: template <typename First, typename ...Args> std::string type_name () { return std::string(typeid(First).name()) + " " + type_name<Args...>(); } std::string type_name () { return ""; } 如何结束递归? 其实有一种非常优雅的方式来结束递归: template <typename Last> std::string type_name () { return std::string(typeid(Last).name()); } template <typename First, typename Second, typename ...Rest> std::string type_name () { return std::string(typeid(First).name()) + " " + type_name<Second, Rest...>(); } 我最初尝试了 template <typename Last> 和 template <typename First, typename ...Rest> 但这被认为是模棱两可的(其余可以是零元素)。然后这个问题向我展示了最终的解决方案:Compilation Error on Recursive Variadic Template Function 注意,为了避免一些代码重复,您还可以这样做: template <typename Last> std::string type_name () { return std::string(typeid(Last).name()); } template <typename First, typename Second, typename ...Rest> std::string type_name () { return type_name<First>() + " " + type_name<Second, Rest...>(); } 你需要使用部分特化来结束递归,但是由于你不能在C++中部分特化自由函数,所以你需要创建一个带有静态成员函数的实现类。 template <typename... Args> struct Impl; template <typename First, typename... Args> struct Impl<First, Args...> { static std::string name() { return std::string(typeid(First).name()) + " " + Impl<Args...>::name(); } }; template <> struct Impl<> { static std::string name() { return ""; } }; template <typename... Args> std::string type_name() { return Impl<Args...>::name(); } int main() { std::cout << type_name<int, bool, char, double>() << std::endl; // "i b c d" return 0; } 第一次声明 Impl 只是 g++ 4.6(及以下版本)中的一个缺点的解决方法。一旦它正确地实现了可变参数模板就没有必要了。 在 ideone.com 上实际查看它 C++17 的 if constexpr 允许您在一个模板声明中执行此操作,这与许多旧的解决方案不同,它非常容易理解: template <typename T, typename ...Args> std::string type_name() { if constexpr (!sizeof...(Args)) { return std::string(typeid(T).name()); } else { return std::string(typeid(T).name()) + " " + type_name<Args...>(); } } 作为函数不存在的偏特化的替代方法,您可以在类型化类上使用重载: #include <string> #include <iostream> #include <typeinfo> template <unsigned int N> struct NumberToType { }; template <typename T> std::string my_type_name(NumberToType<0> = NumberToType<0>()) { return std::string(typeid(T).name()); } template <typename T, typename ...Args> std::string my_type_name(NumberToType<sizeof...(Args)> = NumberToType<sizeof...(Args)>()) { return std::string(typeid(T).name()) + " " + my_type_name<Args...>(NumberToType<sizeof...(Args)-1>()); } int main() { std::cout << my_type_name<int, double, char>() << std::endl; } 作为替代方案,您可以就地解压参数包,如下例所示: #include<string> #include<iostream> #include<typeinfo> template <typename T, typename ...Args> std::string type_name () { std::string str = typeid(T).name(); int arr[] = { 0, (str += std::string{" "} + typeid(Args).name(), 0)... }; (void)arr; return str; } int main() { auto str = type_name<int, double, char>(); std::cout << str << std::endl; } 实际上不需要递归来做到这一点。 使用C++17折表达式: template <typename ...Args> std::string type_name () { return (std::string(typeid(Args).name()) + " " + ...); }

回答 6 投票 0

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