variadic-templates 相关问题

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

根据模板参数切换案例数量

我需要一种有效的方法将 0 到 N-1 范围内的运行时动态 int 转换为模板参数。 也就是说,从逻辑上讲,我想创建一个在 0 和 ... 之间切换数字的开关

回答 1 投票 0

C++ 可变参数模板解包

给出以下代码: void foo(int x, int y, int z, int u) { } 模板 A 类; 模板<>类A<>{}; 模板 类...

回答 1 投票 0

错误C3856:“RecursiveType”:符号不是类模板[重复]

我正在尝试使用像 std::tuple 这样的递归模板创建类型,不幸的是它无法编译,但是我的做法似乎与元组源代码中的方式相同。我正在使用 Visual Studio 进行编译...

回答 2 投票 0

如何在C++中制作像std::tuple这样的递归类型?

我正在尝试使用像 std::tuple 这样的递归模板创建类型,不幸的是它无法编译,但是我的做法似乎与元组源代码中的方式相同。我正在使用 Visual Studio 进行编译...

回答 2 投票 0

如何将模板化固定字符串传递给另一个类的构造函数的重载

我在尝试传递已经初始化的字符串时遇到问题,该字符串实际上没有正确接受重载: #包括 #包括 #包括 我在尝试传递已经初始化的字符串时遇到问题,该字符串实际上没有正确接受重载: #include <cstddef> #include <ranges> #include <algorithm> #include <iostream> template <std::size_t N> class A { char m_m[N]; public: A(char const (&p)[N]) { // Copy p to m_m std::ranges::copy(p, m_m); } }; template <std::size_t N> class B { public: B(A<N> a) { // Perform some operation on 'a' } }; int main() { auto k = B("test"); } 采取,过载正确,但我目前得到: prog.cc:26:22: error: no matching function for call to 'B(const char [5])' prog.cc:20:5: note: candidate: 'template<long unsigned int N> B(A<N>)-> B<N>' 20 | B(A<N> a) { 代码中的问题是类 B 的构造函数需要一个 A<N> 类型的对象,但您试图传递一个字符串文字,它是一个字符数组,而不是 A<N> 类型的对象。 您可以修改 B 构造函数以直接接受字符串文字。 这是代码的更新版本: #include <cstddef> #include <ranges> #include <algorithm> #include <iostream> template <std::size_t N> class A { char m_m[N]; public: A(char const (&p)[N]) { // Copy p to m_m std::copy(p, p + N, m_m); } }; template <std::size_t N> class B { public: B(const char (&p)[N]) { A<N> a(p); // Perform some operation on 'a' } }; int main() { auto k = B("test"); return 0; }

回答 1 投票 0

按值类型重载的函数模板值

在可变非类型模板中,模板列表中的每个值都有其唯一类型: 模板 void print_type(const T &) { std::cout << typeid(T).name() << '\n'; }

回答 1 投票 0

lambda 表达式中大括号后面的括号[重复]

以下代码来自《Modern C++ Tutorial: C++11/14/17/20 On the Fly》一书: 模板自动 printf3(T 值, Ts... args) { std::cout &...

回答 1 投票 0

我如何理解下面的C++代码?

以下代码来自《Modern C++ Tutorial: C++11/14/17/20 On the Fly》一书: 模板自动 printf3(T 值, Ts... args) { std::cout &...

回答 1 投票 0

过滤参数包类型

我想知道是否可以过滤传递给可变参数模板(基于谓词模板)的类型,以生成另一个可变参数模板,其中包含满足预条件的类型...

回答 1 投票 0

如何创建一个指针来存储具有任意数量参数的任何函数?

我正在尝试为我的引擎构建一个事件系统。我的想法是存储指向我希望事件在事件结构中执行的函数的指针,但到目前为止我还没有成功。 我是

回答 1 投票 0

如何反转元组类型中元素类型的顺序?

如何反转元组中的类型?例如,我希望reverse_tuple>::type 为std::tuple。我尝试执行以下操作,但它...

回答 7 投票 0

C++ - 单个参数包可以在单个表达式中多次展开吗?

我有一个函数,它需要 3 个模板参数:两种类型和一个整数常量(用于特征存储要求)。它看起来像下面的模板: 模板 我有一个函数,它需要 3 个模板参数:两种类型和一个整数常量(用于特征存储要求)。它看起来像下面的模板: template <typename In, typename Out, Eigen::StorageOptions Options> void my_big_function(/* 3 Eigen parameters depending on template args... */) { /* Eigen::StorageOptions can also be an integer constant. */ /* Do stuff with matrices... */ } 由于这个函数需要使用多个模板“三元组”绑定到python,我认为这可能是模板参数包的一个很好的使用。 我想实现以下目标: // binds to python : // - my_big_function<float, int, ColMajor>(...) bind_my_big_function<float, int, Eigen::ColMajor>(m); // (1) // binds to python : // - my_big_function<float, int, ColMajor>(...) // - my_big_function<float, int, RowMajor>(...) // - my_big_function<double, int, RowMajor>(...) bind_my_big_function<float, int, Eigen::ColMajor, float, int, Eigen::RowMajor, double, int, Eigen::RowMajor>(m); // (2) 其中bind_my_big_function足够简单: template <typename MatIn, typename MatOut, Eigen::StorageOptions MatOptions, typename...RemainingArgs> void bind_my_big_function(pybind11::module_& m) { /* bind function taking MatIn, MatOut, MatOptions and go onto binding other variants of my_big_function */ } 虽然我肯定可以生成一些处理情况 (1) 的代码,但我无法弄清楚如何编写处理情况 (2) 的代码。我得到的最接近的是这样的: template < typename MatIn, typename MatOut, Eigen::StorageOptions MatOptions > void bind_my_big_function(pybind11::module_& m) { m.def("my_big_function_in_python", &my_big_function<MatIn, MatOut, MatOptions>, /* python arguments...*/); } template < typename MatIn, typename MatOut, Eigen::StorageOptions MatOptions, typename...RemainingArgs, typename = typename std::enable_if_t<sizeof...(RemainingArgs) != 0> > void bind_my_big_function(pybind11::module_& m) { m.def("my_big_function_in_python", &my_big_function<MatIn, MatOut, MatOptions>, /* python arguments...*/); bind_my_big_function<RemainingArgs...>(m); } 参数包应该这样使用吗?我能找到的唯一使用它们的例子是: 使用模板化函数参数, 一次使用单个包扩展“使用”(被调用的函数仅需要一种类型和一个可变参数模板包) 不确定我是否理解这个问题,但是如果你想实例化一些给定的foo<Ts...,Ts...,Ts...>,你可以包装函数模板,只需实例化它:Ts...

回答 1 投票 0

理解 SFINAE:部分专门化类之外的成员函数声明以及可变参数类中的模板

我想做的事: 创建一个“指令集”对象 由别处的指针持有 保存可变数量的指令对象,其类型满足概念“is_instruction_type” 有'额外...

回答 1 投票 0

在编译时获取可变参数模板的索引和值

我有一个看起来像这样的函数 模板 std::tuple call_nn(std::string_view 查询,参数...参数) { pqxx::工作 w(con_); pqxx::ro...

回答 1 投票 0

C++17 嵌套 std::tuple 的递归展平

我有一个函数 unpack,它应该从可变参数模板表达式构造一个 std::tuple。该函数如下所示(包括注释掉的失败尝试): 模板 我有一个函数 unpack,它应该从可变参数模板表达式构造一个 std::tuple。该函数如下所示(包括注释掉的失败尝试): template<typename T, typename... Ts> std::tuple<T,Ts...> unpack(std::stringstream& ss) { T t{}; WriteTypeStruct ret{}; if (writeType(ret, ss, t); (!ss || ret.err)) { throw std::runtime_error(ret.msg); } //std::tuple args = {extract<std::decay_t<Ts>>(ss)...}; //std::tuple args = unpack<typename std::decay_t<Ts>...>(ss); //return {t, unpack<Ts>(ss)...}; //return std::make_tuple(t, unpack<Ts>(ss)...); //std::tuple<Ts...> unpacked = {unpack<Ts>(ss)...}; //return std::make_tuple(t, unpacked); //return std::tuple_cat(std::tuple<T>(t), std::make_from_tuple(unpack<Ts>(ss)...)); return std::make_tuple(t, std::make_from_tuple<Ts...>(unpack<Ts>(ss)...)); // <-- cannot compile! } 函数 writeType 是一系列模板化重载函数,我用它来检查是否可以从 std::stringstream 中提取预期类型。该函数在 WriteTypeStruct 中放置一些返回值,其中包含一个布尔值和一个用于错误消息的字符串。 TLDR;我正在为命令控制台编写一个基于字符串的解释器。 问题的完整介绍如下:如何为基于文本的命令控制台存储参数化的强类型函数,特别是@jarod42的答案。我正在使用这个 unpack 函数而不是 extract。 关于如何展平std::tuple这里有一个很好的解释,但我希望通过首先不创建嵌套元组可以避免这种代码。 但我似乎无法弄清楚正确的语法。 我将从反序列化开始: template<class T> T deserialize(std::stringstream& ss) { T t{}; WriteTypeStruct ret{}; if (writeType(ret, ss, t); (!ss || ret.err)) { throw std::runtime_error(ret.msg); } return t; } 其语义非常简单。 template<class...Ts> std::tuple<Ts...> unpack(std::stringstream& ss) { return std::tuple<Ts...>{ unpack<Ts>(ss)... }; } 保证这些 {} 内的评估顺序。 (注意:这是因为我使用了 {} ctor,而不是函数调用。程序员可以轻松地对上面的内容进行更改,“不执行任何操作”,并以某种方式严重破坏它,具体取决于您使用的编译器。) 大多数 unpack 尝试遇到的问题是它们不能很好地处理 unpack<>(终止情况)。 那些调用 unpack<Ts>... 而不是 unpack<Ts...> 的(即,保证通过 1,并且解包调用在 0 处被消除)最终会导致 1 层过多的元组,unpack<Ts>... 是一组元组,您可以包裹在元组中。 return std::tuple_cat(std::tuple<T>(t), std::make_from_tuple(unpack<Ts>(ss)...)); 这已经很接近了。要修复它: return std::tuple_cat(std::tuple<T>(t), unpack<Ts>(ss)...); 只需去除 tuple 上多余的 unpack 层即可; unpack 已经返回一个元组。然后我们tuple_cat,它支持任意数量的元组。 我们可以尝试优化这个: return std::tuple_cat(std::tuple<T>(t), unpack<Ts...>(ss)); 但这会遇到空的unpack<>问题。 我遇到的一个问题是,您将所有内容放入一个元组中,只是为了再次将其取出。 空的unpack<>也可以处理。在 unpack 之前添加: template<bool empty_pack=true> std::tuple<> unpack(std::stringstream& ss) { return {}; } 那么 unpack<> 应该称之为重载。 但是,我发现所有这些都不如从元组版本调用的 1 元素版本优雅。 最后,我们可以编写一个元组展平函数,它接受任何一组参数,如果其中任何一个是元组,它就会展平它们,并返回融合列表。我个人认为这个函数很诱人,但不是一个好主意,因为它会立即“解决”问题,但随后会导致棘手的问题。 这有点像编写一个对文本进行取消转义的函数,但对任意数量的层进行取消转义,直到不再有转义序列为止。或者转义文本,但拒绝转义任何已经转义的内容。 您将其放入业务逻辑链中,它“解决”了不均匀转义或未转义数据的问题......并以无法修复的方式破坏事物。

回答 1 投票 0

c++ 如何从可变参数包初始化向量?

我有一个模板化容器,将值存储在向量中。字符串或整数没有问题,但 size_t 值无法编译。编译器似乎假设我想用...初始化向量

回答 3 投票 0

c++ 如何从可变参数包初始化向量?

我有一个模板化容器,将值存储在向量中。字符串或整数没有问题,但 size_t 值无法编译。编译器似乎假设我想用...初始化向量

回答 1 投票 0

返回指向成员函数的指针的 C++ 函数

以下内容按预期工作: 模板 auto countNumberOfTypes() { return sizeof...(类型); } 模板 consteval auto functionReturnsFunction() {

回答 1 投票 0

专门化可变参数模板成员函数时出现的问题

我有以下状态机示例,它使用枚举来专门化带有可变参数包的模板方法。当我通过

回答 1 投票 0

仅推导可变参数模板的参数类型

我正在尝试将可变参数模板函数应用于元组。我发现以下适用于 C++14 的解决方案(请参阅 https://stackoverflow.com/a/37100646/2712726)。 #包括 模板<

回答 1 投票 0

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