问题标签 [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.

0 投票
1 回答
50319 浏览

c++ - 如何对可变参数函数中的所有参数调用 std::forward ?

我只是在编写一个通用对象工厂并使用 boost 预处理器元库来制作一个可变参数模板(使用 2010 并且它不支持它们)。我的函数使用 rval 引用并std::forward进行完美转发,这让我开始思考……当 C++0X 出现并且我有一个标准编译器时,我会使用真正的可变参数模板来做到这一点。但是,我会如何呼吁std::forward论点?

我能想到的唯一方法是需要手动解包 ...params ,我也还没到那里。有没有更快的语法可以工作?

0 投票
1 回答
2837 浏览

c++ - 可变参数构造函数是否应该隐藏隐式生成的构造函数?

可变参数构造函数是否应该隐藏隐式生成的构造函数,即默认构造函数和复制构造函数?

不知何故,我希望在阅读此答案后不会打印任何内容,但它会inside the variadic constructor在 g++ 4.5.0 上打印两次 :( 这种行为正确吗?


在没有可变参数模板的情况下也会发生这种情况:

同样,两行都被打印出来。

0 投票
2 回答
1691 浏览

c++ - 模板 boost::bind 自动处理成员函数的多个参数

我有一个带有“附加”函数的类,它接受一个函数对象并将其存储到一个集合中。类本身是在函数签名上模板化的。像这样的东西:

为了演示用法,请考虑以下类:

要将函数传递给ListeningEvent我需要编写:

因此,我没有对每个可能容易出错的情况都这样做,而是编写了一组宏,如下所示:

然后我可以写:

这更容易阅读(我认为)。现在我的问题是:我该如何写:

甚至更好:

, 这样事件 Attach 将神奇地正确绑定到 <Signature> 中包含的适当数量的参数(在本例中为int(int, int, int))?我对您在这里想到的任何模板元编程魔法持开放态度。

谢谢。

编辑:原来我在这里不需要boost::mem_fn,因为boost::bind是等价的,所以在我的宏中我可以使用:

,代替:

然而问题仍然存在:如何传递&MyClass::Hello给事件类并使用模板重载来处理用于模板类的函数原型所隐含的_1, _2,等?_3Event

0 投票
8 回答
14875 浏览

c++ - 可变参数模板

我看过很多介绍可变参数模板的链接。但我从未见过任何演示这种方法的可编译示例。

有人可以为我提供一些可以找到此类可编译示例的链接吗?

0 投票
1 回答
406 浏览

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 占位符。提前感谢您的帮助。

0 投票
4 回答
22737 浏览

c++ - 是否可以“存储”模板参数包而不扩展它?

当我偶然发现这个问题时,我正在尝试使用 C++0x 可变参数模板:

当我尝试 typedef 模板参数包时,GCC 4.5.0 给我一个错误。

基本上,我想将参数包“存储”在 typedef 中,而不是将其解包。是否可以?如果不是,是否有某些原因不允许这样做?

0 投票
1 回答
4827 浏览

c++ - 具有多个模板参数包的部分模板特化

继续我的可变参数模板世界之旅,我遇到了另一个问题。

假设以下模板类:

可以将其部分专门用于可变参数模板实例化,如下所示:

这样,foo< int >将对应于默认实现和foo< std::tuple< int, char > >专门的实现。

但是,当使用多个模板参数时,事情变得更加复杂。例如,如果我们有以下模板类

并且我们想像我们所做的那样对它进行部分专业化foo,我们做不到

事实上,如果我是正确的,我们只能有一个模板参数包,它必须位于参数列表的末尾。我理解为什么这在模板声明中是强制性的,但是对于某些部分模板专业化(如上面的示例),这应该不是问题。

是否可以使用多个模板参数包实现部分模板专业化?


编辑:现在我觉得很傻......我上面给出的代码编译得很好(至少在 gcc 4.5 中)。我遇到的编译错误不是因为多个参数包,而是因为它们用作成员函数参数。在 的部分特化中bar,我尝试定义一个同时接受TArgsUArgs参数的成员函数:

在成员函数声明中,gcc 给了我错误

参数包必须位于参数列表的末尾。

据我所知,编译器应该能够为给定的模板实例定义正确的成员函数,例如bar< std::tuple< int, char >, std::tuple< float > >应该包含一个成员函数void method( int, char, float )。难道我做错了什么?还是我试图做一些不可能的事情?如果是这样,是否有充分的理由说明这是不可能的?

0 投票
2 回答
2750 浏览

c++ - C++0x:如何在没有参考的情况下获取可变参数模板参数?

鉴于以下人为的(是的,可怕的)示例:

如果你这样称呼它,它会起作用:

但是,如果您这样称呼它,它就不起作用:

由于分配给 5。假设无论出于何种原因,我不能在定义元组时对其进行初始化,那么在将类型指定为引用时,我该如何让它工作?

具体来说,我希望元组是std::tuple<int>even when Args...is int&

实际用例涉及将字符串反序列化为元组,其中Args...参数类型是函数的参数类型,然后通过解包元组来调用该函数。这一切都很好,除非函数通过引用获取参数。

我正在使用 gcc 4.5.2,但会接受此编译器中尚未实现的答案。

0 投票
2 回答
4038 浏览

c++ - 将可变参数模板参数转换为其他类型

如何将类型从可变参数模板参数转换为另一种类型?

例如:

我想这样写:

并具有std::tuple<std::vector<int>, std::vector<double>, std::vector<double>>结构序列。并从中获得单身。

std::vector<single<T...>>对我来说是个坏主意,因为我需要一个完整的序列,并且很容易从 .

是否可以?

非常感谢你。对不起,我的英语不好。

0 投票
1 回答
999 浏览

c++ - c++ 初始化器列表和可变参数模板

我想创建一个数组:

为什么不编译?(用 g++ 4.6 测试)