草庐IT

c++ - 如何让编译器为我推断出正确的模板整数

考虑这件作品:templatevoidfill_with_magic(array&whatever){for(inti=0;i我通过特定实例调用它,所以对于3的数组我必须这样做:arraysome_array_of_3;fill_with_magic(some_array_of_3);但我真的必须写吗??编译器已经知道数组大小,因此理论上它可以根据该大小推断出正确的实例。我真的可以做到吗? 最佳答案 问题是参数的推导:std::array的第二个模板参数不是int所以扣除不会发生,因为它需要转换。你应该将你的方法定义为templat

c++ - C++ "type deduction"和 Haskell "type inference"有什么区别?

在英语语义中,“typededuction”等于“typeinferring”吗?我不确定这只是不同语言设计者选择的成语偏好,或者计算机科学给出了严格的“类型推导”定义,哪个不是“类型推断”?谢谢。 最佳答案 C++规范和工作草案广泛使用“类型推导”来指代没有类型声明作为引用的表达式类型;例如thisworkingdraftonconcepts在谈论auto声明的变量时使用它,我记得很多书在谈论模板时都使用它,那时候我不得不学习——然后忘记了大部分——C++。Typeinference但是,它有自己的维基百科页面,也是编程语言理论中

c++ - 为什么我不能推断静态成员函数是否存在

我有以下代码:#includetemplatestructfunc_impl;templateconstexprinlineboolhas_func=false;templateconstexprinlineboolhas_func::apply(std::declval()))>=true;templatestructfunc_impl{staticintapply(inti);};static_assert(has_func);static_assert失败了,而我预计它会成功。我做错了什么? 最佳答案 问题是第二个模板参数的默

c++ - 根据模板函数类型推断变量类型

我有一个模板函数://Overloadedfunctions,Class1In,Class1Out,Class2InandClass2Out//aredefinedinthecode.Class1OutInit(Class1Inone){...}Class2OutInit(Class2Intwo){...}templatevoidf(Aa,intretry_count){Bb=Init(a);//HowtoexpressB?}问题是如何表达B?我尝试了以下方法,但它错误地指出当我调用f时编译器无法推断Btemplatevoidf(Aa,intretry_count){Bb=Init(a

c++ - 是否可以推断出 std::insert_iterator 包含的类型?

我有一个需要模板化迭代器类型的函数。它当前取消引用迭代器以检查被迭代的类型。templatevoidfunc(Iteratori){//Inspectthesizeoftheobjectsbeingiteratedconstsize_ttype_size=sizeof(*i);...}我最近发现一些标准迭代器类型,例如std::insert_iterator将*i定义为对i的简单引用.即sizeof(*i)是迭代器本身的大小;与sizeof(i)或sizeof(***i)相同是否有一种通用方法(支持C++03)来确定任何标准迭代器正在迭代的对象的大小或类型?

C++ 如何在模板中推断 Callable 的类型(参数列表和返回值)

基本上我想做的是制作一个函数模板,它接受任何Callable(函数类型/lambda/Functor)并返回一个lambda-taking-the-similar-args-list并返回原始返回的类型类型#includeintfunc(inta,floatb){returna+b;}structcallable{intoperator()(inta,floatb){returna+b;}};templateautogetLambdaFromCallable(RV(&func)(Args...)){autol=[&](Args...args)->RV{returnfunc(args..

c++ - for range 循环如何推断普通数组大小

考虑这个片段:#includeintmain(){ints[6]{0,1,2,3,4,5};for(auto&&i:s){std::cout这可以在g++和clang++下顺利编译和运行。它在许多帖子中被认为是理所当然的(例如here和here),但我不清楚编译器如何正确推断forrange中数组的大小没有迭代器的类型。任何人都可以回答或添加指向引用的链接吗? 最佳答案 根据工作草案[6.5.4/1]:Therange-basedforstatementfor(for-range-declaration:for-range-init

c++ - 柯里化(Currying)函数的惰性类型推断

在下面的例子中,调用mkPair2的类型推断失败了:#includetemplatestructPair{Aleft;Bright;};templatePairmkPair1(Aleft,Bright){return(Pair){left,right};}templatestd::function(B)>mkPair2(Aleft){return[left](Bright){return(Pair){left,right};};}Pairex1=mkPair1(2,'a');Pairex2=mkPair2(2)('a');问题是mkPair2有两个模板参数,但是调用(2)只提供其中一个

C++模板模板推断类型参数

我有一个基本类型templatestructBase{};以及基于许多版本的Base构建的更复杂的东西(有些是int模板,有些是类模板):templatetypenamebasetype,typenamep,typenameq>structComplex{};然后,我创建这样的变量:Complex,Base>c;有没有办法推断我的第一个模板参数是Base,或者p和q是basetype的特殊版本所以我可以写Complex,Base>c;我想没有。但模板有时会隐藏一些魔力。 最佳答案 如果你想要Complex总是让它的两个参数是同一个模

c++ - 无法从初始化列表中的 lambda 中推断出类型

#include#includenamespace{//conststd::functionfoo[]=constautofoo[]={[](constintv){std::cout上面的示例无法编译(使用g++4.6.1)并出现下一条错误消息:error:unabletodeduce'conststd::initializer_list[]'from'{{},{},{}}'注释行工作正常(没有指定函数类型)。这是g++的怪癖吗?或者标准中是否有任何内容告诉上述内容不应编译? 最佳答案 你不能这样做。每个lambda都有一个唯一的、