在这里打死马。在C中进行整数幂运算的典型(且快速)方法是这种经典方法:int64_tipow(int64_tbase,intexp){int64_tresult=1;while(exp){if(exp&1)result*=base;exp>>=1;base*=base;}returnresult;}但是我需要一个编译时整数幂,所以我继续使用constexpr进行递归实现:constexprint64_tipow_(intbase,intexp){returnexp>1?ipow_(base,(exp>>1)+(exp&1))*ipow_(base,exp>>1):base;}const
如果我知道如何提取匹配类型,是否有一种现代方式来表达有条件地从不同类型的源容器复制到目标容器的意图?将问题作为代码示例提出更容易:#include#includestructFoo{};structFooBar{boolis_valid;Foofoo;};std::vectorget_valid_foos(conststd::vector&foobars){std::vectorvalid_foos;for(constauto&fbar:foobars){if(fbar.is_valid)valid_foos.push_back(fbar.foo);}returnvalid_foos;
我在寻找什么:我有一个模板化类,如果该类具有所需的函数,我想调用一个函数,例如:templatedo_something(){ifconstexpr(std::is_member_function_pointer::value){this->_t->x();//_tistypeofT*}}会发生什么:如果T没有带来函数,编译器就不会编译。小例子:#include#includeclassFoo{public:voidx(){}};classBar{};intmain(){std::cout::value::value编译器说:is_member_function_pointer.cpp
这个问题在这里已经有了答案:Whydoweneedtomarkfunctionsasconstexpr?(4个答案)关闭6年前。放宽constexpr的规则后,这些函数似乎可以在任何地方使用。它们也可以在常量(constexpr)和局部(可变)变量上调用。所以对我来说,这似乎只是对编译器的提示(如内联)。我只是到处写它,如果编译器提示就删除它。所以编译器似乎知道一个函数是否可以在编译时求值的一切。为什么这不是默认行为,为什么我必须将任何内容标记为constexpr?
我习惯用enum{my_const=123;来定义常量},因为在类中,使用staticconstexpr需要类定义之外的一些代码(参见thisquestion)。但是-在函数体中呢?最近我一直注意到人们只是在他们的函数中使用constexpr变量(实际上甚至不屑于const它们),我想知道我是否是一个落后的傻瓜我的时代intfoo(intx){enum:int{bar=456};returnx+bar;}所以,我的问题是:在函数体内使用枚举而不是constexpr变量有什么好处吗? 最佳答案 如果bar是constexprintba
据我了解,constexpr与模板元编程不同,它不是图灵完备的,所以我相信它们是不一样的。所以问题是constexpr在多大程度上使模板元编程过时了? 最佳答案 constexpr绝对是图灵完备的。允许递归。它是定义在编译时和运行时工作的函数的便捷方式。constexpr函数只是函数,不能对类型执行操作。(当然,除非您使用模板元编程来定义所述函数。)类模板和constexpr都可以用来包含编译时常量表达式,但相似之处仅此而已。它们不是多余的,TMP不会很快消失。不过,一些特别丑陋的编译时计算可能会更优雅地重写为适当的函数。
我问了thisquestion早些时候在哪里asolution被提出。就问题而言,解决方案很棒,但现在我对如何定义类的方法outside感到困惑,即我想在.inl中定义方法文件。这种情况下的语法是什么?明确一点,对于模板类,方法定义为:templatestructFoo{Foo();};//C-tordefinitiontemplateFoo::Foo(){}我如何为模板类定义方法,将enable_if作为参数之一?template::value>::type>structFoo{ Foo();};//C-tordefinition--??? 最佳答案
也许已经有人问过类似的问题,当然,这是一个吹毛求疵...我有一堆常量std::map用于在enum(class)值和它们的std::string表示之间切换(双向)。这里有人向我指出,这些映射将在运行时初始化,当其他初始化代码运行时,在我的程序执行所有好东西之前。这意味着常量表达式会影响运行时性能,因为映射是根据它们的枚举字符串对构建的。作为说明性示例,这里是其中一张map的示例:enumclassos{Windows,Linux,MacOSX};constmapos_map={{"windows",os::Windows},{"linux",os::Linux},{"mac",os:
我有两个问题——(一)code-fragment-1if(){}elseif(){//statements-1}//statements-2代码片段2if(){}else{if(){//statements-1}//statements-2}以上两段代码是否相同?(II)什么时候使用elseif(在C++中)? 最佳答案 唯一的区别是在示例1中,无论您检查的条件如何,您的Statement2都会执行。在示例2中,Statement2只有在您的if条件为假时才会执行。除此之外,它们基本相同。
我们遇到过这种情况,想知道解决它的最佳方法templatestructA:T{A(T&&t)noexcept(noexcept(T(std::move(t)))):T(std::move(t)){}};不幸的是编译失败,因为T的移动构造函数是protected,我们只能在*this的构造函数初始化列表中调用它。使这项工作有什么变通办法,或者甚至有标准的方法吗? 最佳答案 您正在寻找noexcept(std::is_nothrow_move_constructible::value):http://en.cppreference.co