草庐IT

c++ - 模板类型推导失败?

考虑以下示例。#include#includeusingnamespacestd;templateusingIntegral=typenamestd::enable_if::value,T_>::type;templateusingNotIntegral=typenamestd::enable_if::value,T_>::type;templatevoidprintIt(constIntegral&value){coutvoidprintIt(constNotIntegral&value){coutvoidfoo(constT_&value){printIt(value);}intm

c++ - 引用模板类型推导

我一直在尝试使用带有以下形式代码的模板进行类型推导/打印:#includetemplateclassprintType{};templatestd::ostream&operator&){osstd::ostream&operator&){os()std::ostream&operator&){os()printTypeprint(T){returnprintType();}intmain(){inta=7;int*p=&a;int&r=a;//OK:returnSomeType*std::cout我想知道我是否可以获得最后一行返回int&,即:(i)让函数模板print推断出它的参数

c++ - 推导非类型模板参数

是否可以从模板函数参数中推导出非类型模板参数?考虑这个简单的模板:templateconstexprintfactorial(){returnN*factorial();}templateconstexprintfactorial(){return1;}templateconstexprintfactorial(){return1;}我希望能够更改factorial以便我可以这样调用它:factorial(5);并让编译器在编译时计算出N的值。这可能吗?也许添加了一些花哨的C++11? 最佳答案 我相信您当前的代码通常会写成如下:c

一张图带你看完图论第三章(包含定义、定理、公式、推导证明和例题)

3.1割边、割点、块割边定义:去掉后连通分支数增加,且一定加一         ω(G-e)>ω(G)若G连通,则删去割边e后不连通          非平凡树每条边均为割边判定:e是割边当且仅当e不在任何圈中非割边一定在圈中,割边一定不在圈中因结论若在G的含e的连通分支中成立,则必在G中成立,所以我们不妨假定G连通证:1.必要性设e=uv是图G的割边,若e含在圈C中,令P=C-e                    易知P是G-e中一条(u,v)路                    G-e中任意两个不同点x和y,因G连通,故G中存在(x,y)路Γ                    

c++ - 推导原始类型的知识,同时转发

总结:我想以一个函数结束,该函数推导它被调用的确切类型并采用(例如)转发它们的元组(其类型将不同于确切的类型)调用函数的类型)。我一直在尝试通过推导来“了解”给定函数的参数类型,同时转发它们。我想我可能遗漏了有关其工作原理的一些重要信息。#include#include#includetemplatestructunresolved_linker_to_print_the_type{unresolved_linker_to_print_the_type();};voidf(int,double,void*,std::string&,constchar*){}templatevoidg1

c++ - 推导给定参数类型的选定重载函数类型

在给定重载集和参数列表的情况下,是否可以确定重载决策将选择的候选函数类型?例如,给定:char*f(int);intf(char*);我希望能够写出这样的东西:overload::typex;声明一个变量x类型char*(*)(int).这可能吗?我的第一直觉是写这样的东西:templatestructoverload{templatestaticautodeduce(Ret(*fptr)(Args...))->decltype(fptr);};...但这无法处理非精确匹配(即decltype(overload::deduce(f))有效,但decltype(overload::ded

c++ - 表达式模板中的按引用捕获可以与类型推导共存吗?

表达式模板通常用作避免创建临时对象的优化技术。他们推迟构造完整的对象,直到模板用于赋值或初始化。这可用于字符串生成器、线性代数包等。为了避免昂贵的拷贝,表达式模板类可以通过引用捕获更大的参数。我将使用Qt的QStringBuilder作为示例。当引用比表达式模板长时它起作用:QStringfoo=QString("A")+QString("B");^^^^^^^^^^^^^^^^^^^^^^^^^^^QStringBuilder,QConcatenable>表达式模板的转换和解析发生在赋值时。临时字符串比赋值还长。唉,一旦推断出表达式模板类型而不是目标类型,我们就会遇到麻烦://WOR

c++ - 在 C++ 中使用显式原型(prototype)进行返回类型推导

我一直在研究g++中支持的返回类型推导和-std=c++1y。如果您为具有显式返回类型的函数原型(prototype),然后尝试使用返回类型推导定义函数,编译器会提示旧声明不明确:std::stringsome_function();...autosome_function(){returnstd::string{"FOO"};}//failstocompile这行不通有充分的理由吗?我在定义中使用返回类型推导的理由是为了保持代码简洁,但出于self记录的原因,希望原型(prototype)中有一个显式类型。关于何时以及何时不使用返回类型推导的最佳实践的建议将不胜感激:)为了更清楚,我

c++ - 是否保证模板模板参数调用用户提供的推导指南

考虑一个例子:#include#includetemplateclassTT>//#1structFoo{staticvoidfoo(){static_assert(std::is_same_v>);}};templatestructBar{Bar(T){}};templateBar(T)->Bar;//#2intmain(){Foo::foo();}[clang]以及[gcc]在推导模板模板参数(#1)的模板参数时,两者似乎都使用用户提供的推导指南(#2)。它是否符合标准? 最佳答案 是的,这是符合标准的。根据[dcl.type.

c++ - 具有模板参数推导和默认模板参数的模板变量

对similarquestion感到惊讶(并感到困惑)我自己尝试了提到的问题在标准中找到的例子:templatestructS;templatestructS{voidf(){std::cout上面的代码打印出voidS::f()[T=int,U=int]compiledwithgccHEAD8.0.1201803但无法使用clangHEAD7.0.0进行编译除非在实例化期间使用尖括号:Ss;s.f();//error:declarationofvariable's'withdeducedtype'S'requiresaninitializerSt;t.f();//Correct撇开这