我们能否将可变参数模板参数限制在某种types? 即,实现这样的事情(当然不是真正的C ++): struct X {}; auto foo(X… args) 这里我的意图是有一个接受可变数量的X参数的函数。 我们最近的是这样的: template <class… Args> auto foo(Args… args) 但是这接受任何types的参数。
以下3个gunfunction的区别是什么? template <class… Ts> void fun(Ts… vs) { gun(A<Ts…>::hun(vs)…); gun(A<Ts…>::hun(vs…)); gun(A<Ts>::hun(vs)…); } 我对使用一个具体例子解释这三个调用的答案感兴趣。
我想知道是否有可能写一个模板函数,可以采取任何其他任意模板作为参数,并正确匹配模板名称(即不只是结果类)。 我所知道的工作是这样的: template<template<typename …> class TemplateT, typename… TemplateP> void f(const TemplateT<TemplateP…>& param); 这将匹配例如f(std::vector<int>())或f(std::list<int>())但不会为f(std::array<int, 3>()) ,因为第二个参数是size_t而没有types。 现在我想可以做一些疯狂的事情: template<template<typename …> class TemplateT, size… Sizes, typename… TemplateP> void f(const TemplateT<Sizes…, TemplateP…>& param); 希望编译器能正确地派生TemplateP省略号或Sizes省略号为空。 但是,这不仅丑陋,而且还适用于采用type或size_t参数的模板。 它仍然不会匹配例如与bool参数的任意模板。 重载方法也是如此: template<template<typename …> class TemplateT, typename… TemplateP> void f(const TemplateT<TemplateP…>& param); template<template<typename …> class TemplateT, size… Sizes> void f(const TemplateT<Sizes…>& param); 此外,如果我们想要混合size_t和typenames ,这种方法不会工作。 […]
这个关于对象生成器模式的问题让我想到了使它自动化的方法。 本质上,我想自动创build像std::make_pair , std::bind1st和std::mem_fun这样的函数,以便不必为每个模板类types编写不同的函数,可以编写单个可变模板模板函数即时处理所有案件。 这个函数的用法如下: make<std::pair>(1, 2); // equivalent to std::make_pair(1, 2) make<std::binder2nd>(&foo, 3); // equivalent to std::bind2nd(&foo, 3); 可以写这个函数吗? 我已经尝试过,但是在GCC 4.5或4.6中不起作用: template <template <typename…> class TemplateClass, typename… Args> TemplateClass<Args…> make(Args&&… args) { return TemplateClass<Args…>(std::forward<Args>(args)…); } 如果我尝试打电话(例如) make<std::pair>(1, 2)我只是得到 error: no matching function for call to 'make(int, int)' 我在这里的任何地方都有语法错误吗? 或者这是正确的,海湾合作委员会是错的? 或者,这只是在C ++ 0x从根本上不可能? [编辑] build议N2555似乎暗示这是允许的, […]
我试图用Visual C ++ 11build立googletest,但下面的代码会导致错误 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>& t, // <– error C2977 ::std::ostream* os) { PrintTupleTo(t, os); } 这是一个错误文字: f:\gtest-1.6.0\include\gtest\gtest-printers.h(550): error C2977: 'std::tuple' : too many template arguments […]
如果我定义一个接受模板参数的struct模板Bar : template <template <int,bool,char> class> struct Bar {}; 我可以使用一个struct模板(如Zod来实例化它: template <int,bool,char> struct Zod {}; Bar<Zod> a; 我也可以使用嵌套的struct模板(如JKL来实例化它: struct GHI { template <int,bool,char> struct JKL {}; }; Bar <GHI::JKL> b; 为什么我不能使用嵌套可变参数struct模板(如DEF ?)实例化Bar : template <typename …Ts> struct ABC { template <Ts …> struct DEF {}; }; Bar<ABC<int,bool,char>::DEF> c; G ++ 4.9.2抱怨types/值不匹配; 而Clang 3.4.2的错误报告模板模板参数具有不同于其对应的模板参数的模板参数。
我一直在学习可变参数模板,在这篇出色的博客文章的帮助下,我设法编写了一个函数模板even_number_of_args ,它返回它收到的参数个数是否可以被2整除。 #include <iostream> bool even_number_of_args() { return true; } template <typename T> bool even_number_of_args(T _) { return false; } template<typename T, typename U, typename… Vs> bool even_number_of_args(T _, U __, Vs… vs) { return even_number_of_args(vs…); } int main() { std::cout << even_number_of_args() << std::endl; // true std::cout << even_number_of_args(1) << std::endl; // false std::cout […]
我怎样才能得到一个可变参数的模板函数的数量? 即: template<typename… T> void f(const T&… t) { int n = number_of_args(t); … } 在上面实现number_of_args的最好方法是什么?
在Boost邮件列表中 ,@LouisDionne最近发布了下面这个聪明的技巧来创build一个元组实体: #include <iostream> auto list = [](auto …xs) { return [=](auto access) { return access(xs…); }; }; auto length = [](auto xs) { return xs([](auto …z) { return sizeof…(z); }); }; int main() { std::cout << length(list(1, '2', "3")); // 3 } 现场示例 。 巧妙的是, list是一个lambda采用可变参数列表作为input,并返回一个lambda作为输出,将采取另一个lambda作用于其input。 类似地, length是一个lambdaexpression式,它将向列表的原始input参数提供variadic sizeof…操作符。 sizeof…运算符被封装在一个lambda中,以便它可以传递给list 。 问题 :这个元组创作习惯有没有名字? 也许从函数式编程语言中,更高阶的函数更常用。
当我偶然发现这个问题时,我正在试验C ++ 0x variadic模板: template < typename …Args > struct identities { typedef Args type; //compile error: "parameter packs not expanded with '…' }; //The following code just shows an example of potential use, but has no relation //with what I am actually trying to achieve. template < typename T > struct convert_in_tuple { typedef […]