我能否准确指定模板可以接收的参数类型?例如,我想创建一个模板,它只能用A类或扩展类A的类实例化。在Java中,泛型通过以下方式支持这一点:classB{}可以用C++中的模板实现类似的东西吗?templateclassB{} 最佳答案 有两种方法可以做到这一点。首先,通过使用std::enable_if的隐藏虚拟模板参数用std::is_base_of::value作为条件。如果后一个表达式计算为false,然后是嵌套的type在std::enable_if中不存在.如果您在重载函数上使用它,SFINAE则意味着“替换失败不是错误”
考虑代码:#include#includestructtest1{voidInvoke(){};};structtest2{templatevoidInvoke(){};};enumclassInvokableKind{NOT_INVOKABLE,INVOKABLE_FUNCTION,INVOKABLE_FUNCTION_TEMPLATE};templatestructget_invokable_kind{conststaticInvokableKindvalue=InvokableKind::NOT_INVOKABLE;};templatestructget_invokable_ki
假设我有以下模板:templateunionexample{Tt;constexprexample(constT&t):t(t){};/*Werelyonowningclasstotakecare*ofdestructingtheactivemember*/~example(){};};因为那里的析构函数,example永远不会被轻易破坏(因此不是文字类型)。我喜欢像这样的部分特化templateunionexample::value,T>>{Tt;constexprexample(constT&t):t(t){};};让example当T时可以轻易破坏是,但不幸的是,这给了我(事后看
我有Vector(CVector)、Matrix(CMatrix)和Tensor(CTensor)类,我希望能够从CTensor隐式转换类到CVector如果sizeof...(Sizes)==1类和CMatrix如果sizeof...(Sizes)==2类,所以我有以下转换运算符(最初我没有std::enable_if模板参数希望我可以使用SFINAE来防止它编译):template::type=0>operatorCMatrix()const{static_assert(sizeof...(Sizes)==2,"Youcanonlyconvertarank2tensortoamat
我想编写一个模板类,它使用SFINAE检查特征。正如我在那篇文章中读到的那样,类不能被“重载”:templateoverloadingandSFINAEworkingonlywithfunctionsbutnotclasses我写了下面的代码:classAA{public:usingTRAIT=int;};classBB{public:usingTRAIT=float;};templateclassX;templateclassX::value,int>::type>{public:X(){std::coutclassX::value,unsignedint>::type>{publi
我想用成员函数模板以某种方式迭代一个元组(以便稍后从给定的模板类型T创建一个新类型的元组)。但是,没有使用中断条件(函数)所以我得到这个错误:invaliduseofincompletetype:'classstd::tuple_element>'问题似乎是,即使N==size的元组,std::tuple_element_t也被评估为N!=size并且不作为SFINAE处理。两个示例都显示了不同的无效解决方案。我做错了什么?注意:省略了使用is_same评估的函数以最小化示例。#include#includetemplatestructA{usingtuple=std::tuple;s
重构遗留代码我想合并彼此相关的单独模板类/结构(以避免命名空间污染)。Nested(下)是MyStruct的辅助类,我想将其移入MyStruct。但我无法完成这项工作:#include#includestructYES{};structNO{};templatestructMyStruct{templatestructNested{staticvoidPrint(void){std::cout::Print()"structNested::value,YES>::type>{staticvoidPrint(void){std::cout::Print()"编译器提示:g++-O0-g3
我有一个模板类,它有一个方法,其中模板参数指定该方法的输入和输出,如下所示:templateclassFoo{Outfn(constIn&in){Outout;returnout;}}所以我尝试了这个,但是当尝试将void用于In或Out时(可能很明显)出现错误。所以我尝试添加多种方法,这些方法是这个主题的变体,希望它们的替换能够启用相关功能并禁用无效功能:template::value>*=nullptr>OutputTypefn(){OutputTypeout;returnout;}template::value)&&(!std::is_void::value)>*=nullptr
我希望一个类有两种不同的push实现,并根据bool模板参数进行选择。我尝试使用thisanswer中描述的SFINAE原理,像这样:templateclassBar{templatetypenamestd::enable_if::typepush(constT&value){/*oneimplementation*/}templatetypenamestd::enable_if::typepush(constT&value){/*anotherimplementation*/}}但是,我在gcc下收到“无法在类范围内特化函数push”的错误,我不明白为什么。尽管我的代码与链接答案中的
我想设计一个自动提供operator的模板所有类(class)T为此T::print_to(std::ostream&)存在并且可以被调用,这样我就可以将打印函数定义为成员函数(特别是利用虚拟调用)。通过反复试验,我设法得出了这个结论:template().print_to(std::declval()))>std::ostream&operator它似乎有效,但由于我对SFINAE和这类技巧还很陌生,想知道是否有任何陷阱或可以改进。我在https://ideone.com/uLJxac放了一个小测试台.如果可能,我想要一个C++14解决方案,因为我正在使用C++14代码库。但是,如果