问题标签 [variadic-templates]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 简单的可变参数模板函数无法实例化
我知道这会sizeof...(Args...)
产生 C++0x 打包模板参数列表中的类型数量,但我想根据其他功能来实现它以进行演示,但它不会编译。
这个错误*HERE*
与
即它没有看到首先定义的基本情况。前向声明template<typename...T>num_args();
在重载决议中引入了歧义。
我正在使用 gcc 4.6。我怎样才能使这项工作?
谢谢。
c++ - 可变参数模板 - 编译错误
您能帮我修复以下代码中的编译错误吗:
我得到错误,没有匹配的函数调用
注:候选人是:
gcc 版本 4.4.3 (Ubuntu 4.4.3-4ubuntu5)
谢谢肯定
c++11 - is_base_of 与 bind 一起使用时的错误行为
将可变参数模板参数与简单的模板参数一起使用时,我在is_base_of从绑定仿函数实例化时遇到了一些奇怪的行为。
这是代码:
程序输出为:
但我希望:
我是否以错误的方式使用可变参数模板?有没有其他(正确的)方法来获得像 Args 这样的可变参数类型列表的第一种类型?为什么只有在与绑定表达式一起使用时才会出现问题?
请注意,如果我将 Base 模板修改为只有一个模板参数,则绑定表达式有效:
recursion - 递归可变参数模板打印出参数包的内容
如何创建一个递归可变参数模板来打印出参数包的内容?我正在尝试这个,但它无法编译:
我该如何结束递归?
variadic-functions - 将可变参数宏转换为可变参数模板函数?
给定以下形式的可变参数宏:
——如何将其重写为可变参数函数模板?
更新:我对如何声明Args
:&&
或const&
什么的引用类型特别感兴趣?
更新:请注意,FType 应该是一个“普通”函数指针。
c++ - 使用 C++11 可变参数模板在编译时快速排序
我刚刚通过使用 C++11 可变参数模板在编译时对其进行评估来实现快速排序算法。但是,当数据集太大时,我会遇到性能问题。
当数据集为TEST_DATA_100时,编译需要1.7s。
当数据集为 TEST_DATA_1000 时,编译器似乎停止了......
我正在使用 gcc 4.6.0。
c++ - 如何遍历打包的可变参数模板参数列表?
我试图找到一种方法来迭代一个包可变参数模板参数列表。现在与所有迭代一样,您需要某种方法来了解打包列表中有多少参数,更重要的是如何从打包参数列表中单独获取数据。
总体思路是遍历列表,将所有 int 类型的数据存储到一个向量中,将所有 char* 类型的数据存储到一个向量中,并将所有浮点类型的数据存储到一个向量中。在此过程中,还需要一个单独的向量来存储参数输入顺序的各个字符。例如,当您 push_back(a_float) 时,您也在执行 push_back('f'),它只是存储一个单独的字符来了解数据的顺序。我也可以在这里使用 std::string 并简单地使用 +=。该向量仅用作示例。
现在设计的方式是使用宏构造函数本身,尽管有恶意,但它是必需的,因为这是一个实验。所以实际上不可能使用递归调用,因为包含所有这些的实际实现将在编译时扩展;并且您不能重新生成宏。
尽管所有可能的尝试,我仍然坚持弄清楚如何实际做到这一点。因此,我使用了一种更复杂的方法,该方法涉及构造一个类型,并将该类型传递给 varadic 模板,将其扩展为一个向量,然后简单地对其进行迭代。但是我不想像这样调用函数:
所以真正的问题是没有这样的我怎么办?为了让你们更好地理解代码实际在做什么,我粘贴了我目前正在使用的乐观方法。
我知道这很讨厌,但这是一个纯粹的实验,不会用于生产代码。这纯粹是一个想法。它可能可以做得更好。但是,您将如何使用此系统的示例:
看起来很像蟒蛇。它也可以,但唯一的问题是你如何调用这个函数。这是一个简单的例子:
我需要构建一个新的 any 类型,它非常美观,但这并不是说这些宏也不是。顺便说一句,我只想选择这样做: foo(1000);
我知道这是可以做到的,我只需要某种迭代方法,或者更重要的是一些用于打包可变参数模板参数列表的 std::get 方法。我确信可以做到这一点。
另外需要注意的是,我很清楚这并不完全是类型友好的,因为我只支持 int,float,char* ,这对我来说没问题。我不需要其他任何东西,我将添加检查以使用 type_traits 来验证传递的参数确实是正确的参数,以便在数据不正确时产生编译时错误。这完全不是问题。除了这些 POD 类型之外,我也不需要任何支持。
如果我能得到一些建设性的帮助,我将不胜感激,反对关于我纯粹不合逻辑和愚蠢地使用宏和仅 POD 类型的争论。我很清楚代码是多么脆弱和破碎。这是 merley 的一个实验,我稍后可以纠正非 POD 数据的问题,并使其更加类型安全和可用。
感谢您的理解,我期待提供帮助。
c++ - Necessity of forward-declaring template functions
I recently created this example code to illustrate C++11 variadic template function usage.
If the first two lines which forward-declare foo
are omitted then this prints int:123int:123
instead. This surprised a certain experienced and knowledgeable C++ programmer.
He was convinced the forward-declarations shouldn't be necessary because the body won't be instantiated until the second phase of two-phase lookup. He thinks the compiler (gcc 4.6) has a bug.
I believe the compiler is right because the two foo
are different base template functions and the choice of base template needs to be locked-in during the first phase or else you could violate the one-definition rule by instantiating foo
before all versions of it have been defined and then again afterwards (consider how the linker assumes that redundant template function definitions are identical, interchangeable, and discardable).
So, who is right?
The above-linked GOTW nicely explains how and why function templates don't partially specialise, but the existence of variadic template functions seems to add to the confusion -- the intuition that foo<int,Tail...>
should be a partial specialisation of foo<Head,Tail...>
is stronger than that intuition for non-variadic functions, at least to me.