Questions tagged «variadic-templates»

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

8
“解包”一个元组以调用匹配的函数指针
我正在尝试存储std::tuple各种数量的值,这些值稍后将用作与存储类型匹配的函数指针的调用的参数。 我创建了一个简化的示例,显示了我正在努力解决的问题: #include <iostream> #include <tuple> void f(int a, double b, void* c) { std::cout << a << ":" << b << ":" << c << std::endl; } template <typename ...Args> struct save_it_for_later { std::tuple<Args...> params; void (*func)(Args...); void delayed_dispatch() { // How can I "unpack" params to call func? …

6
make_unique和完美的转发
为什么std::make_unique标准C ++ 11库中没有功能模板?我发现 std::unique_ptr<SomeUserDefinedType> p(new SomeUserDefinedType(1, 2, 3)); 有点冗长。以下内容会更好吗? auto p = std::make_unique<SomeUserDefinedType>(1, 2, 3); 这new很好地隐藏了,只提及了一次类型。 无论如何,这是我尝试实现的make_unique: template<typename T, typename... Args> std::unique_ptr<T> make_unique(Args&&... args) { return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); } 我花了很std::forward长时间才可以编译这些东西,但是我不确定它是否正确。是吗?到底是什么std::forward<Args>(args)...意思?编译器如何处理?

1
如何对可变参数函数中的所有参数调用std :: forward?
我只是在编写一个通用对象工厂,并使用boost预处理器元库制作一个可变参数模板(使用2010,但它不支持它们)。我的函数使用rval引用并std::forward进行完美的转发,这让我开始想...当C ++ 0X出现并且我有一个标准的编译器时,我将使用真实的可变参数模板进行此操作。不过,我std::forward该如何谈谈? template <typename ...Params> void f(Params... params) // how do I say these are rvalue reference? { y(std::forward(...params)); //? - I doubt this would work. } 我能想到的唯一方法是需要手动解压缩... params,而且我也还没有。有没有一种更快的语法可以工作?

2
“……”标记的含义是什么?即参数包上的双省略号运算符
浏览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 { /* ... */ }; 那么,该令牌的含义是什么? 编辑:看起来像这样将标题中的“ ......”修饰为“ ...”,我的意思是“ ......”。:)

2
在可变参数模板的上下文中,“…”令牌的规则是什么?
在C ++ 11中,有这样的可变参数模板: template< class T, class... Args > unique_ptr<T> make_unique( Args&&... args ) { return unique_ptr<T>(new T(std::forward<Args>(args)...)); } 对此有一些好奇:表达式同时std::forward<Args>(args)...使用Args且args仅使用一个...标记。此外,还有std::forward一种仅采用一个模板参数和一个自变量的非可变模板函数。(大致)有什么语法规则?如何将其概括? 另外:在函数实现中,省略号(...)位于关注表达式的末尾。是否有原因在模板参数列表和参数列表中省略号位于中间?

4
如何存储可变参数模板参数?
是否可以以某种方式存储参数包以备后用? 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, …


10
漂亮打印std :: tuple
这是我先前关于漂亮打印的STL容器的问题的跟进,我们设法为其开发了一个非常优雅且完全通用的解决方案。 在接下来的步骤中,我想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,对定界符)的加分点!

6
可变参数模板包扩展
我正在尝试学习可变参数的模板和功能。我不明白为什么这段代码无法编译: 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)。

5
如何对可变参数模板函数的异构参数包进行通用计算?
前提: 在使用了可变参数模板后,我意识到,要完成琐碎的元编程任务之外的任何事情,很快就会变得很麻烦。特别是,我发现自己希望的执行方式上的参数包一般操作如迭代,拆分,循环在一个std::for_each样的方式,等等。 在观看了C ++和Beyond 2012的Andrei Alexandrescu的关于static ifC ++(从D编程语言中借用的结构)的可取性的演讲之后,我感到有些东西static for也将派上用场-我感到更多这样的static结构可以带来利益。 于是我开始想知道如果有一种方法来实现这样的一个可变参数模板函数的参数包(伪代码): template<typename... Ts> void my_function(Ts&&... args) { static for (int i = 0; i < sizeof...(args); i++) // PSEUDO-CODE! { foo(nth_value_of<i>(args)); } } 它将在编译时转换为如下形式: template<typename... Ts> void my_function(Ts&&... args) { foo(nth_value_of<0>(args)); foo(nth_value_of<1>(args)); // ... foo(nth_value_of<sizeof...(args) - 1>(args)); } 原则上,static_for将允许进行更精细的处理: template<typename... Ts> …


3
如何在C ++中创建类型列表的笛卡尔乘积方法?
自我解释。 基本上说我有这样的类型列表: using type_list_1 = type_list<int, somestructA>; using type_list_2 = type_list<somestructB>; using type_list_3 = type_list<double, short>; 它们可以是各种类型的类型列表。 如何获得笛卡尔积的类型列表? result = type_list< type_list<int, somestructB, double>, type_list<int, somestructB, short>, type_list<somestructA, somestructB, double>, type_list<somestructA, somestructB, short> >; 我确实涉足如何创建如下所示的双向笛卡尔乘积:如何创建类型列表的笛卡尔乘积?,但n方法似乎并不那么琐碎。 现在我正在尝试... template <typename...> struct type_list{}; // To concatenate template <typename... Ts, typename... Us> constexpr auto …

3
可变参数模板:组中展开参数
我有一个带有两个参数的函数: template <typename T1, typename T2> void foo(T1 arg1, T2 arg2) { std::cout << arg1 << " + " << arg2 << '\n'; } 一个可变参数的参数应该成对转发: template <typename... Args> void bar(Args&&... args) { static_assert(sizeof...(Args) % 2 == 0); ( foo( std::forward<Args>(args), std::forward<Args>(args) ), ... ); // ^ Sends each argument twice, …

5
如何使参数包成组折叠或成对折叠?
template<class Msg, class... Args> std::wstring descf(Msg, Args&&... args) { std::wostringstream woss; owss << Msg << ". " << ... << " " << args << ": '" << args << "' ";//not legal at all //or owss << Msg << ". " << args[0] << ": '" << args[1] << …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.