问题标签 [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++ - 如何对可变参数函数中的所有参数调用 std::forward ?
我只是在编写一个通用对象工厂并使用 boost 预处理器元库来制作一个可变参数模板(使用 2010 并且它不支持它们)。我的函数使用 rval 引用并std::forward
进行完美转发,这让我开始思考……当 C++0X 出现并且我有一个标准编译器时,我会使用真正的可变参数模板来做到这一点。但是,我会如何呼吁std::forward
论点?
我能想到的唯一方法是需要手动解包 ...params ,我也还没到那里。有没有更快的语法可以工作?
c++ - 可变参数构造函数是否应该隐藏隐式生成的构造函数?
可变参数构造函数是否应该隐藏隐式生成的构造函数,即默认构造函数和复制构造函数?
不知何故,我希望在阅读此答案后不会打印任何内容,但它会inside the variadic constructor
在 g++ 4.5.0 上打印两次 :( 这种行为正确吗?
在没有可变参数模板的情况下也会发生这种情况:
同样,两行都被打印出来。
c++ - 模板 boost::bind 自动处理成员函数的多个参数
我有一个带有“附加”函数的类,它接受一个函数对象并将其存储到一个集合中。类本身是在函数签名上模板化的。像这样的东西:
为了演示用法,请考虑以下类:
要将函数传递给Listening
,Event
我需要编写:
因此,我没有对每个可能容易出错的情况都这样做,而是编写了一组宏,如下所示:
然后我可以写:
这更容易阅读(我认为)。现在我的问题是:我该如何写:
甚至更好:
, 这样事件 Attach 将神奇地正确绑定到 <Signature> 中包含的适当数量的参数(在本例中为int(int, int, int)
)?我对您在这里想到的任何模板元编程魔法持开放态度。
谢谢。
编辑:原来我在这里不需要boost::mem_fn
,因为boost::bind
是等价的,所以在我的宏中我可以使用:
,代替:
然而问题仍然存在:如何传递&MyClass::Hello
给事件类并使用模板重载来处理用于模板类的函数原型所隐含的_1
, _2
,等?_3
Event
c++ - 可变参数模板
我看过很多介绍可变参数模板的链接。但我从未见过任何演示这种方法的可编译示例。
有人可以为我提供一些可以找到此类可编译示例的链接吗?
boost - 用于可变参数模板向量的 mpl 样式 copy_if 元函数
我有一个可以与常规 boost mpl 配合使用的元程序。它看起来更像以下内容。
我正在尝试使用可变参数模板向量 (mpl::vector) 对其进行编译。为此,我正在使用此处找到的可变参数模板向量的实现:https ://svn.boost.org/svn/boost/sandbox/variadic_templates
尽管有一些测试,但我在 repo 中找不到可用的 copy_if、remove_if 和 count_if 实现。那些元程序在那里,我只是找不到它们?或者,您能否帮我实现其中一个,以便它也支持 mpl 占位符。提前感谢您的帮助。
c++ - 是否可以“存储”模板参数包而不扩展它?
当我偶然发现这个问题时,我正在尝试使用 C++0x 可变参数模板:
当我尝试 typedef 模板参数包时,GCC 4.5.0 给我一个错误。
基本上,我想将参数包“存储”在 typedef 中,而不是将其解包。是否可以?如果不是,是否有某些原因不允许这样做?
c++ - 具有多个模板参数包的部分模板特化
继续我的可变参数模板世界之旅,我遇到了另一个问题。
假设以下模板类:
可以将其部分专门用于可变参数模板实例化,如下所示:
这样,foo< int >
将对应于默认实现和foo< std::tuple< int, char > >
专门的实现。
但是,当使用多个模板参数时,事情变得更加复杂。例如,如果我们有以下模板类
并且我们想像我们所做的那样对它进行部分专业化foo
,我们做不到
事实上,如果我是正确的,我们只能有一个模板参数包,它必须位于参数列表的末尾。我理解为什么这在模板声明中是强制性的,但是对于某些部分模板专业化(如上面的示例),这应该不是问题。
是否可以使用多个模板参数包实现部分模板专业化?
编辑:现在我觉得很傻......我上面给出的代码编译得很好(至少在 gcc 4.5 中)。我遇到的编译错误不是因为多个参数包,而是因为它们用作成员函数参数。在 的部分特化中bar
,我尝试定义一个同时接受TArgs
和UArgs
参数的成员函数:
在成员函数声明中,gcc 给了我错误
参数包必须位于参数列表的末尾。
据我所知,编译器应该能够为给定的模板实例定义正确的成员函数,例如bar< std::tuple< int, char >, std::tuple< float > >
应该包含一个成员函数void method( int, char, float )
。难道我做错了什么?还是我试图做一些不可能的事情?如果是这样,是否有充分的理由说明这是不可能的?
c++ - C++0x:如何在没有参考的情况下获取可变参数模板参数?
鉴于以下人为的(是的,可怕的)示例:
如果你这样称呼它,它会起作用:
但是,如果您这样称呼它,它就不起作用:
由于分配给 5。假设无论出于何种原因,我不能在定义元组时对其进行初始化,那么在将类型指定为引用时,我该如何让它工作?
具体来说,我希望元组是std::tuple<int>
even when Args...
is int&
。
实际用例涉及将字符串反序列化为元组,其中Args...
参数类型是函数的参数类型,然后通过解包元组来调用该函数。这一切都很好,除非函数通过引用获取参数。
我正在使用 gcc 4.5.2,但会接受此编译器中尚未实现的答案。
c++ - 将可变参数模板参数转换为其他类型
如何将类型从可变参数模板参数转换为另一种类型?
例如:
我想这样写:
并具有std::tuple<std::vector<int>, std::vector<double>, std::vector<double>>
结构序列。并从中获得单身。
std::vector<single<T...>>
对我来说是个坏主意,因为我需要一个完整的序列,并且很容易从 .
是否可以?
非常感谢你。对不起,我的英语不好。
c++ - c++ 初始化器列表和可变参数模板
我想创建一个数组:
为什么不编译?(用 g++ 4.6 测试)