草庐IT

c++ - 派发良好模板功能的最佳方式

我有三个函数,做几乎相同的事情,但根据参数类型的不同,过程略有不同:templatevoidFunc1(constT*in,T*out){static_assert(std::is_same::value||std::is_same::value||std::is_same::value||std::is_same::value,"");//...}templatevoidFunc2(constT*in,T*out){static_assert(std::is_same::value||std::is_same::value,"");//...}templatevoidFunc3(co

c++ - 是否可以显式特化模板以匹配 lambda?

假设我有一个headerwrapper.h:templatevoidwrapper(constFuncfunc);和一个文件wrapper.cpp包含:#include"wrapper.h"templatevoidwrapper(constFuncfunc){func();}还有一个文件main.cpp包含:#include"wrapper.h"#includeintmain(){wrapper([](){std::cout如果我将这些一起编译(例如,catwrapper.cppmain.cpp|g++-std=c++11-omain-xc++-),我没有收到链接器错误。但是如果我单独

c++ - 模板函数静态变量

我有一个模板函数,可以根据传递给它的typename给我一个唯一的id,如下所示:templateinlinestd::size_tget_component_type_id()noexcept{static_assert(std::is_base_of::value,"TmustbeoftypeComponent.");staticsize_tuniqueComponentId{__INTERNAL__::getUniqueComponentId()};returnuniqueComponentId;}当我用BaseClass调用get_component_type_id10次时,我

c++ - 为什么递归模板的 decltype 返回类型失败,而返回类型推导工作得很好?

在处理C++11类型集时,我尝试实现此功能(精简到最低限度):constexprautotest()->bool;templateconstexprautotest()->decltype(test()){return{};}gcc和clang都因此而窒息。clang说:test.cpp:54:40:error:'Rest'doesnotrefertoavalueconstexprautotest()->decltype(test())^gcc提示:test.cpp:54:44:error:expectedprimary-expressionbefore‘...’tokenconste

c++ - decltype(some_vector)::size_type 不能用作模板参数

下面的类不编译:template,classAllocator=std::allocator>classMyContainer{public:std::vectordata;std::vector>order;};我收到以下编译器错误:error:type/valuemismatchatargument2intemplateparameterlistfor‘templatestructstd::pair’为什么编译失败,而下面的代码工作正常?template,classAllocator=std::allocator>classMyContainer{public:std::vecto

c++ - 是否可以将模板的所有实例化类声明为相互友元?

这个问题在这里已经有了答案:Howtodeclareatemplatedstruct/classasafriend?(1个回答)关闭6年前。假设我有一个模板(助手)类,我想让模板的所有实例化类成为友元(这样我就可以将一些静态成员函数隐藏为私有(private),即使它们偶尔会在内部切换模板参数)。像这样:templateclassFoo{templatefriendclassFoo;//...};但是,这不会编译,因为gcc警告我我正在专门化一些不允许的模板(必须出现在namespace范围内)。我不想专精任何东西......有什么办法吗?最初,由于有很多参数,我试图使用可变参数模板来

c++ - 将虚拟方法作为接收迭代器的模板

我知道不能在C++中为虚方法使用模板(反之亦然),例如讨论here和here.不幸的是,我不确定在我的案例中如何处理该限制。我们有一个包含方法模板的类模板:templateclassBeliefSet:publicBelief{private:std::vectorm_Facts;public:templatevoidSetFacts(IterIterBegin,IterIterEnd,boolAppend=false){if(!Append){m_Facts.clear();}m_Facts.insert(m_Facts.end(),IterBegin,IterEnd);}};Set

c++ - "Conditional"别名模板

在类似非特化模板结构的类型中pointer_traits(即templatestructpointer_traits),存在一个成员别名模板rebind定义为Ptr::rebind,如果存在,否则为其他类型。虽然我已经看到一些关于检查某个成员是否存在的答案,但如何实现一个“条件”别名模板,如pointer_traits::rebind?也就是说,就好像通过以下伪C++:templateusingtype=has_type?int:float;或templateusingtype=if_has_type::type;我考虑过使用类似于https://en.wikibooks.org/wi

c++ - 访问嵌套模板类型

假设有一个类A和MyTypetemplateclassMyType{...}templateclassA{...}当我使用A>创建A的实例时如何访问A中的模板类型int? 最佳答案 公开一个typealias给用户:templateclassMyType{public:usingInnerDataType=DataType;};templateclassA{public:usingInnerType=MyType;};用法:usingMyA=A>;static_assert(std::is_same{});liveexampleon

c++ - 具有空参数包的递归可变参数模板(以避免基本情况的重复)

我正在试验C++递归模板,但我不知道为什么我的模板不起作用。假设我想定义一个递归函数,它接受可变数量的参数(针对不同类型)。我看过很多可变参数模板的示例,到目前为止我所看到的所有示例都使用单独的模板特化来指定基本情况。但是,我认为使用单个模板会更好(至少在某些情况下),它定义了基本情况和递归情况。我认为如果您在函数中有很多通用逻辑,我认为这种方法特别好,您必须为您的基本案例实例复制这些逻辑(在两个不同的地方使用完全相同的代码)。下面示例中的第二个模板应该是我的解决方案。我认为这个模板应该可以独立运行。然而,事实并非如此。没有第一个模板,代码无法编译:error:nomatchingfu