Tag: variadic templates

可变参数模板上下文中“…”标记的规则是什么?

在C ++ 11中有像这样的可变参数模板: template< class T, class… Args > unique_ptr<T> make_unique( Args&&… args ) { return unique_ptr<T>(new T(std::forward<Args>(args)…)); } 这里有一些好奇心:expression式std::forward<Args>(args)…使用Args和args但只有一个…标记。 此外, std::forward是一个非variables模板函数,只需要一个模板参数和一个参数。 这个(粗略的)是什么语法规则? 怎么可以推广? 另外:在函数实现中,省略号( … )在感兴趣的expression式的末尾。 是否有一个原因,在模板参数列表和参数列表省略号在中间?

带有包扩展的variablesfunction模板不在最后一个参数中

我想知道为什么下面的代码不能编译: struct S { template <typename… T> S(T…, int); }; S c{0, 0}; 这段代码无法使用clang和GCC 4.8进行编译。 这是clang的错误: test.cpp:7:3: error: no matching constructor for initialization of 'S' S c{0, 0}; ^~~~~~~ test.cpp:4:5: note: candidate constructor not viable: requires 1 argument, but 2 were provided S(T…, int); ^ 在我看来,这应该起作用,而T应该被推断为是一包长度为1的包。 如果标准禁止这样做,有没有人知道为什么?

如何存储可变参数模板?

是否有可能以某种方式存储参数包供以后使用? template <typename… T> class Action { private: std::function<void(T…)> f; T… args; // <— something like this public: Action(std::function<void(T…)> f, T… args) : f(f), args(args) {} void act(){ f(args); // <— such that this will be possible } } 接下来: void main(){ Action<int,int> add([](int x, int y){std::cout << (x+y);}, 3, 4); //… add.act(); }

检查可变参数的唯一性参数

我想variadic模板参数必须唯一。 我知道当多inheritance时,不允许相同的类inheritance。 struct A{}; struct B: A, A{}; // error 使用这个规则,我做了一个小小的代码。 #include <type_traits> template< class T> struct id{}; template< class …T> struct base_all : id<T> … {}; template< class … T> struct is_unique { template< class … U> static constexpr bool test( base_all<U…> * ) noexcept { return true; } template< class … U> static […]

为每个可变参数和一个数组调用一个函数

所以我有一些typesX : typedef … X; 和一个模板函数f : class <typename T> void f(X& x_out, const T& arg_in); 然后一个函数g : void g(const X* x_array, size_t x_array_size); 我需要写一个variadic模板函数h来做到这一点: template<typename… Args> void h(Args… args) { constexpr size_t nargs = sizeof…(args); // get number of args X x_array[nargs]; // create X array of that size for (int i = 0; […]

C ++ 11:我可以从多个参数到元组,但我可以从元组去多个参数?

可能重复: 如何将元组展开成可变参数模板函数的参数? “解包”一个元组来调用一个匹配的函数指针 在C ++ 11模板中,有没有一种方法可以将元组用作(可能是模板)函数的单独参数? 例: 比方说我有这个function: void foo(int a, int b) { } 我有tuple auto bar = std::make_tuple(1, 2) 。 我可以用它来模仿foo(1, 2)吗? 我不是简单的foo(std::get<0>(bar), std::get<1>(bar))因为我想在一个不知道参数个数的模板中做这个。 更完整的例子: template<typename Func, typename… Args> void caller(Func func, Args… args) { auto argtuple = std::make_tuple(args…); do_stuff_with_tuple(argtuple); func(insert_magic_here(argtuple)); // <– this is the hard part } 我应该注意到,我宁愿不创build一个模板,适用于一个参数,另一个适用于两个,等等…

如何调用所有可变参数模板参数的函数?

我想做 template<typename… ArgTypes> void print(ArgTypes… Args) { print(Args)…; } 它相当于这个相当庞大的recursion链: template<typename T, typename… ArgTypes> void print(const T& t, ArgTypes… Args) { print(t); print(Args…); } 接下来是我想要打印的每种types的明确的单参数专业化。 recursion实现的“问题”是生成了大量冗余代码,因为每个recursion步骤都会产生N-1参数的新函数,而我想要的代码只会生成单个N – printfunction,最多有N专门的printfunction。

什么是“… …”令牌的含义? 即参数包中的双省略号运算符

在浏览gcc当前的新C ++ 11头文件的过程中,我偶然发现了“……”令牌。 你可以检查,下面的代码编译罚款 [通过ideone.com]。 template <typename T> struct X { /* … */ }; template <typename T, typename … U> struct X<T(U……)> // this line is the important one { /* … */ }; 那么,这个令牌的含义是什么? 编辑:看起来像修剪“……”问题标题为“…”,我确实是指“……”。 🙂

漂亮的std ::元组

这是我之前关于漂亮打印STL容器的问题的一个后续,为此我们开发了一个非常优雅和全面的通用解决scheme。 在接下来的步骤中,我想包含std::tuple<Args…>漂亮打印,使用可变参数模板(所以这完全是C ++ 11)。 对于std::pair<S,T> ,我只是说 std::ostream & operator<<(std::ostream & o, const std::pair<S,T> & p) { return o << "(" << p.first << ", " << p.second << ")"; } 什么是打印元组的类似结构? 我尝试了各种各样的模板参数堆栈解包,传递索引,并使用SFINAE来发现当我在最后一个元素,但没有成功。 我不会用我破碎的代码来加重你的负担。 问题描述有希望足够简单。 基本上,我想要以下行为: auto a = std::make_tuple(5, "Hello", -0.1); std::cout << a << std::endl; // prints: (5, "Hello", -0.1) 与上一个问题一样包含相同级别的通用性(char / wchar_t,一对分隔符)!

可变模板包扩展

我正在尝试学习可变参数模板和函数。 我不明白为什么这个代码不能编译: template<typename T> static void bar(T t) {} template<typename… Args> static void foo2(Args… args) { (bar(args)…); } int main() { foo2(1, 2, 3, "3"); return 0; } 当我编译失败,错误: 错误C3520:“args”:参数包必须在此上下文中展开 (在函数foo2 )。