首页 > TAG信息列表 > variadic-templates
c-参数包未以“…”扩展-另一个gcc可变参数模板错误?
众所周知,gcc对可变参数模板的处理是不完整的(例如参见this和this),但是我想知道以下错误是否已经为人所知(我无法在bugzilla上找到)还是确实是一个错误.本质上,gcc(4.8.1)无法在lambda内扩展参数包: #include <vector> #include <algorithm> #include <type_traits> template<typc-检查的防护参数包是否导致程序格式错误?
我不止一次(甚至在SO上)看到了这样的代码: template<typename U, typename... G, typename T = Traits<U>> struct { static_assert(sizeof...(G) == 0, "!"); // ... }; 或这个: template<typename T, typename... G, typename = std::enable_if_t<conditc-在模板化类的可变参数模板中包装每种类型
给定可变参数模板类型…,我想存储A<>.包装中的每种类型.这可以在A的元组中完成,但是我需要以编程方式导出所述元组的类型. 在c 11/14/17中甚至有可能发生这种情况吗? template <class T> class A { }; template <class... Types> class B { // A tuple of A<>'s for each typec-为什么一个可变参数类模板最多具有一个参数包?
有时候我希望可以编写一个由 标点符号模板参数包的标点列表,例如 template<typename ...lhs, int Punct, typename ...rhs> struct tuple_pair { std::tuple<lhs...> _lhs; std::tuple<rhs...> _rhs; }; 或就此而言: template<int ...lhs, typename Punct, int ...rhs> sc-我的std :: hash for std :: tuples …有什么改进吗?
有些人可能已经注意到std :: hash不支持元组.因此,我添加了一个过载,该过载似乎比到目前为止看到的解决方案“更小”.有人有想法进一步削减此代码吗?请注意,这是编译器的杀手!!唯一可以编译的语言是“ Clang 3.2” … Intel Compiler 13.1没有得到专门化,并且一直在告诉“ C标准不支c-可变参数模板运算符<<
我试图将我的一些函数foo()更改为operator<<(),只是为了使某些“ half C / half C”代码看起来更像C.发生了,但是,我陷入了以下转换步骤: template <class... T> inline const size_t foo(const T&... data) { return sizeof...(T); } struct bar { template <class... T>c – 参数包扩展的顺序
我有2个函数来读取二进制文件. 第一个函数从文件中读取sizeof(T)字节: template<typename T> T read() { ... some IO operations ... }; 第二个函数使用每个模板参数多次调用第一个: template<typename... Ts> std::tuple<Ts...> read_all() { return std::make_tuple(read<Tc – 将可变参数模板参数传递给可变参数函数
我们正在使用第三方C库,它提供了printf()风格的日志功能, void log(const char *format, ...); 由于不值得进入的原因,我们需要限制消息记录的速率,这有点像 void rate_limited_log(const char* format, ...) { if (<not too fast>) { log(format, ...); } }c – 重载成员函数的decltype
参见英文答案 > Disambiguate overloaded member function pointer being passed as template parameter 1个 我有这个代码: struct Foo { int print(int a, double b); int print(int a); vc – g可变参数模板问题
所以我把这个程序交给g和clang(在Linux,x86_64上): #include <iostream> using namespace std; template<char... Cs> struct A { static const string s; static A a; ~A() { cout << "s = " << s << "\n"; } }; tempc – 使用gcc 4.4的模板模板参数和可变参数模板
我在Debian上使用gcc 4.4.请考虑以下代码. #include <map> #include <string> using std::map; using std::string; // Args lets the user specify additional explicit template arguments template <typename T, template <typename T, typename... Args>c中的评估顺序初始化数组
我喜欢c 11可变参数模板,所以我经常用它写一些小代码. 看这个例子: #include <cstdio> #include <type_traits> #include <vector> template< typename ... T > auto make_vector(T ... t ) -> std::vector< typename std::common_type<T...>::type > { std在参数中强制执行单一类型的C参数包
我希望能够做到以下几点: #include <array> struct blah { }; template<typename... Args> constexpr auto foo(Args&&... args) { return std::array<blah, sizeof...(Args)>{{ args... }}; } auto res = foo({}, {}); 以下答案并不令人满意:他们只想检查参数包是否为单一类消除C 11可变参数模板参数中的重复条目
我在C中使用具有多个虚拟继承的可变参数模板,以将类型聚合到单个结构定义中. 以下是一组结构示例: struct meas { int i; }; struct meas2 : public virtual meas { int j; }; struct meas3 : public virtual meas { int k; }; 然后我使用多个虚拟继承来聚合它们: template <typenc – 获取第N种可变参数模板模板?
如何获取第N种可变参数模板模板?例如 template<typename... Args> class MyClass { Args[0] mA; // This is wrong. How to get the type? }; 解决方法:你可以使用std :: tuple: #include<tuple> template<typename... Args> class MyClass { typename std::tuple_elemec – 我可以扩展参数包并用它定义参数列表吗?
从[temp.variadic](工作草案)开始,在我看来,可以在定义另一个模板类或函数的参数列表时扩展参数包. 考虑以下课程: template<typename... T> struct S { template<T... I> void m() {} }; int main() { S<int, char> s; // ... } 目的是捕获用于专门化模板类S的c – 从元组中解包参数
所以我想弄清楚它是如何工作的:C++11: I can go from multiple args to tuple, but can I go from tuple to multiple args? 我不明白的黑魔法是这段代码片段: f(std::get<N>(std::forward<Tuple>(t))...) 这是我不明白的f里面的表达. 我理解表达式以某种方式解压缩/扩展内部的内容c – 不是非类型参数包,评估为“void …”非法?
gcc-4.8接受这个代码,但是没有错,因为非类型参数包等同于void …这是非法的? template <typename T, typename std::enable_if<std::is_integral<T>::value>::type...> void test(T) {} 我用clang-3.5尝试了这个,也接受了它.这是编译器错误,还是我误解了什么? 下面的完整javascript – 如何从标记函数调用本机es6模板字符串替换?
我正在为模板文字编写一个es6标记函数,它首先检查字符串中的条件,如果找不到条件,则仅解释模板文字,就好像它是未标记的一样.我很好奇,如果从我的标签功能,有一种方法来调用浏览器的本机模板文字函数(我认为它比我自己实现的函数更快). Bonue:有了这个,就不可能有标签组合的机会,例c – 使用不同参数的std ::函数的集合
我正在尝试编写一个简单的调度程序,用户代码可以将回调附加到它. 每个事件都有一个已知的签名,用户代码需要使用正确的数字和参数类型调用dispatch.这由可变参数管理.但是,freestandingInt不被接受,因为向量不是正确的类型.如何使它通用? 遵循一个最小的例子 void freestanding() {c – 模板模板参数和默认值
参见英文答案 > Deducing first template argument with other template parameters defaulted 2个 请考虑以下代码: template<typename T> struct A { }; // same as A, but with one extra defaulted pc – 选择可变参数模板的最后一个参数的有效方法
我知道如何选择可变参数模板的第一个参数: template< class...Args> struct select_first; template< class A, class ...Args> struct select_first<A,Args...>{ using type = A;}; 这很简单.但是,select_last不相似: template< class ...Args> struct select_last; templatec – 有人可以解释“指数技巧”吗?
我注意到在精美打印元组的上下文中提到了“索引技巧”.这听起来很有趣,所以我跟着the link. 嗯,那不顺利.我理解了这个问题,但实际上并不能跟踪发生的事情.为什么我们甚至需要任何指数?那里定义的不同功能如何帮助我们?什么是’裸露’?等等 有人可以为参数包和可变元组的专家提供那种c – 由clang采取的免费扣除指南 – 谁是正确的?
请考虑以下代码: template <typename... Types> struct list { template <typename... Args> list(Args...) { static_assert(sizeof...(Types) > 0); } }; template <typename... Args> list(Args...) -> list<Args...>;什么是C 14中这种C 17倍表达的良好替代品?
这是一个很好的,简洁的折叠表达式基于C 17的lambda: #include <cstdint> using ::std::uint64_t; constexpr auto sumsquares = [](auto... n) { return ((n * n) + ...); }; // I want this to work. uint64_t foo(uint64_t x, uint64_t y, uint64_t z) { return sumsquare