jjzjj

decltype

全部标签

c++ - 使用 decltype 转换一个值,这可能吗?

是否可以使用decltype来转换值?例如,假设我们有以下模板:templateautofindInposition(Container&c,intposition)->decltype(*(c.begin())){if(std::distance(c.begin(),c.begin()+position)返回容器中特定位置的项目值。假设用户输入的位置大于容器的大小,在这种情况下我想返回一个转换值,比如说转换为零或其他值。我不知道我的例子是否足够好,我的主要问题是:是否可以使用decltype来转换一个值,如果是的话如何转换? 最佳答案

C++:可以使用 decltype 从我的头文件中复制类型吗?

我想在事情发生变化时减少我必须对代码进行的维护工作量。在某个头文件中,我有一些冗长冗长的内容,如下所示:externstd::map>event_schedule;然后,在一个cpp文件中,我认为像这样实际声明它会更容易;decltype(event_schedule)event_schedule;有什么理由不吗? 最佳答案 不,没有理由不这样做。唯一可能反对的论点是“你看不到类型”。这个论点已经针对auto提出了很多,但从未真正设法“引起注意”。您通常关心的是您可以使用该类型做什么,而不是该类型的实际名称到底有多Shiny。

异常情况下的 C++ 错误 C2228( '.val' 左侧必须有类/结构/union )

在C++中,我正在尝试实现自己的any使用C++的类。然而,在我能够对其进行测试之前(如果我的实现不好,请随时纠正我),我得到了错误:errorC2228:leftof'.val'musthaveclass/struct/union使用value()两次功能两次,当它在其他地方工作时,这看起来很奇怪。我唯一能想到的就是decltype函数前面导致错误,但它不应该:编辑:我更新了为templateany(TV){...}更改变量的方式构造函数classany{protected:templatestructvariable{public:Tval;variable(){}variable

C++:在初始化程序中类静态变量的定义中查找名称

我有简单的代码:#includeclassA{public:staticinta;};voida(){}intA::a=[](){static_assert(std::is_function::value,"'a'isnotafunction");return777;}();intmain(){return0;}在编译期间(使用g++4.8.1和clang3.4)关于'a'的getstatic断言错误不是函数。但是在assert内部,在decltype中我输入了'a'(它是一个函数)而不是A::a。编译器不应该采用函数(a)而不是类成员(A::a)吗?您能否在解释C++规范的地方给出任

c++ - 如何修复模板内的错误重构 decltype

编辑可能无法完成,请参阅Cleanimplementationoffunctiontemplatetakingfunctionpointer虽然答案1有一个C宏解决方法https://stackoverflow.com/a/18706623/2332068我将一个函数传递到模板中以成为构造函数的预提供参数,但还需要使用decltype在该函数上将函数类型传递给unique_ptr模板实例化器(?这个词对吗)如果我预先使用decltype就可以了作为一个额外的模板参数,但如果我在作为参数传递的函数的模板中调用它,则不会。我正在使用g++4.9.2,并在此处扩展我的探索Callinginh

c++ - 是否有 decltype 的快捷方式

在thisanswer我写了C++17代码:cout{});这收到了一些关于C++类型关联性质的负面评论,我很遗憾地说我同意:(decay_t{}是一种非常复杂的方法来获得:Zero-initializedtypeofanelementofnumbers是否可以保持与numbers类型的关联?'元素,而不是键入30个字符来获取它?编辑:我有很多答案都涉及accumulate的包装器或者从numbers[0]中提取类型.问题是它们要求读者导航到次要位置以阅读不比初始化代码复杂的解决方案decay_t{}.我们必须做更多事情的唯一原因:decltype(numbers[0])是因为arra

c++ - 模板函数参数类型中的模板标识符与 decltype

你认为哪个更好?templatevoidfunc(Tx,Ty){}或templatevoidfunc(Tx,decltype(x)y){}恕我直言,第二种形式似乎更可取,因为x和y类型之间的链接是明确的,并且至少在重命名模板标识符时,事情似乎不太容易出错。编辑第二种形式允许您使用第一个参数使用的子类型调用函数,而第一种形式需要完全相同的类型。这个论点似乎比前一个稍微好一点。 最佳答案 它们在语义上是不同的,所以这取决于你想要实现什么。第二个比第一个限制更多。考虑:templatevoidfunc1(Tx,decltype(x)y){

c++ - 通过 lambda 部分特化类模板

我有存储函数或成员函数信息(如返回类型、数字或参数等)的模板类型。templatestructSFuncInfo{usingSignature=R(FuncParams...);usingRet=R;staticconstexprsize_tnumParams=sizeof...(FuncParams);};//membertemplatestructSFuncInfo:SFuncInfo{staticconstexprboolisMemberFunction=true;};//functiontemplatestructSFuncInfo:SFuncInfo{staticconste

c++推导 "non type pointer to function"类模板参数

考虑一个模板类:templateclassProxy{voidrun(){ReturnTyperet=Fn();//...dosomething...}};//andafunctionsintfn1(){return5;}floatfn2(){return5;}这可以通过使用实例化:Proxyp1;但是显式声明返回值类型似乎是不必要的。我想要实现的是:someProxyInstantationp1;someProxyInstantationp2;不幸的是,我对c++没有任何期望,这似乎是该语言的一个隐藏角落(至少对我而言)。如果我可以从指向函数的指针获取它的类型——类似于:std::t

C++ decltype 无法推导类型

decltype在VisualStudio2012中真的有问题还是它实际上应该这么难用?例子:namespaceptl{structTest{Test(float){}};templatestaticT*static_constructor(void*p,A0a0){returnnew(p)T(a0);}templateT*MakeVS2012Happy(T*);}inlineautoExampleFxn()->decltype(ptl::MakeVS2012Happy(&ptl::static_constructor)){return&ptl::static_constructor;