草庐IT

variadic-templates

全部标签

c++ - 可变参数模板的声明点

什么时候可变参数模板被认为是“声明的”?这会在clang++3.4下编译,但不会在g++4.8.2下编译。templateconstT&sum(constT&v){returnv;}templateautosum(constT&v,constTs&...params)->decltype(v+sum(params...));templateautosum(constT&v,constTs&...params)->decltype(v+sum(params...)){returnv+sum(params...);}intmain(){sum(1,2,3);}显然g++不会在尾随返回类型中

c++ - 将 nullptr 传递给可变模板指针

我目前有以下功能:templatevoidGet(T*out,Args*...other);templatevoidGet(T*out);templatevoidGet(int*out);templatevoidGet(int64*out);templatevoidGet(double*out);templatevoidGet(char**out);templatevoidGet(void**out);调用使用:Get(&i,&t,&f);i为int,t为char*和f作为double。如果我想传递一个空指针,这非常有用,但有一个异常(exception)。Get(&i,nullptr

c++ - 可变参数模板扩展中的函数调用顺序

我在一个开源项目中找到的代码基本上是这样的:templatevoidexpand_calls_hack(Args&&...args){}templatestructfoo{staticvoidbar(some_tuple_type&t){meta::expand_calls_hack((std::get(t).doSomething(),0)...);}};我认为这个“构造”用于为每个元组元素调用doSomething()。然而,在我看来,对doSomething()的调用顺序是未定义的,至少在C++03中是正常函数。这将是一个错误,因为调用有副作用。我有两个问题:(tupleElem

c++打包和解包参数包以在没有STL的情况下调用匹配的函数指针

我正在尝试创建一个类,该类将存储指向具有可变数量参数的函数的指针,并在稍后调用它。想法是为函数创建一个包装器,该函数将在对象析构时调用所述函数。这样我就可以确保在退出某些功能后进行一些清理。我现在拥有的是FaheemMitha发布的一点修改代码here.这是带有示例的工作代码(我正在使用VisualStudio2015编译它):#include"stdafx.h"#include#includeusingnamespacestd;templatestructseq{};templatestructgens:gens{};templatestructgens{typedefseqtype

c++ - 如何避免重复使用 "indices trick"?

我有一个名为memory_region的类,有点像未类型化的gsl::span(即它本质上是一个void*和一个size_t),我也将其用于类型删除。因此它有一个as_span()方法。对于这个类,我有一个std::unordered_mapmy_map-它用于在我的不共享header的代码部分之间传递类型删除的跨度,因此它们无法了解彼此的类型。对其中之一的典型访问如下所示:autofoo=my_map.at("foo").as_span();这对于具有一组固定缓冲区、类型和名称的代码来说效果很好。但是-当我的代码缓冲区依赖于模板参数包时,事情就变得棘手了。现在,我实现了一个std::

c++ - 类型名和标量常量的可变参数模板

我正在尝试实现一个通用类模板,它将它的模板参数转发给另一个类,如下所示:templateclassA:publicB{...问题是B可以有这样的标量常量模板:templateclassB{...甚至像这样:templateclassB{...那么,有什么方法可以接受混合的类型名和标量常量作为可变参数模板参数吗? 最佳答案 您可以将值嵌入到类型中。如果我没记错的话,这是boost长期使用的一种技术,并作为std::integral_constant添加到C++11的标准库中(表明它的有用性)。使用C++17,事情变得更加简单。temp

c++ - 调试可变参数

我目前正在调试我们构建中的一个问题,在可变参数中,参数的数量与预期不符。目前我的代码看起来类似于:classCustomException:publicBaseException{public:templateCustomException(T&&...args):BaseException(std::forward(args)...){static_assert(sizeof...(T)==2);}};throwCustomException{size_t{},size_t{}};根据这段代码,人们会期望将2个参数传递给Ctor。令人惊讶的是,此代码在MSVC上的表现与预期一致,但在

c++ - 将函数传递给可变函数模板

考虑以下函数模板:templatevoidfoo0(std::functionf){}templatevoidfoo1(std::functionf){}以及以下函数:voidbar(intn){}为什么会出现以下情况:foo0(bar);//doesnotcompilefoo1(bar);//compilesfine编译错误是(gcc-8withC++17):error:nomatchingfunctionforcallto'foo0(void(&)(int))'foo0(bar);^note:candidate:'templatevoidfoo0(std::function)'vo

c++ - 包装递归可变参数模板类会改变行为。为什么?

希望这会引起社区中的一些人的兴趣。希望它不会太明显,因为我不确定发生了什么。我创建了具有递归定义的可变参数模板类,主要是作为一个有趣的self挑战。有点像一个元组,这个类创建unordered_maps的unordered_maps,到任意深度并且在每一层具有任意键类型。例如,您可以创建nested_map然后用map["fred"][3.4][42]=35;设置它这是代码-不太疯狂。templatestructnested_map_base:std::unordered_map{T&operator[](constK&key){//justtoverifywegettothebott

c++ - 在模板参数列表中使用 sizeof... 时为 "too few template arguments"(MSVC 2017)

以下最小示例不基于当前的MSVC2017(19.16)。它确实基于MSVC2015和2017(19.14)的旧版本、GCC、Clang和ICC。所以我怀疑这是一个编译器错误。有效吗?如果不是,为什么?#include#includetemplateautofoo(std::integer_sequence){returnstd::array{Is...};}std::arraybar(){returnfoo(std::make_integer_sequence());}有效的变体:投入unsigned(sizeof...(Is))在参数列表中作为默认参数替换unsigned(...)与