C++的杂七杂八:constexpr与编译期计算
1. 编译期计算 我们先来看一段求阶乘(factorial)的算法: size_t factorial(size_t n) noexcept { return (n == 0) ? 1 : n * factorial(n - 1); } 很明显,这是一段运行期算法。程序运行的时候,传递一个值,它可以是一个变...
1. 编译期计算 我们先来看一段求阶乘(factorial)的算法: size_t factorial(size_t n) noexcept { return (n == 0) ? 1 : n * factorial(n - 1); } 很明显,这是一段运行期算法。程序运行的时候,传递一个值,它可以是一个变...
在C++中,存在“可调用对象(callable objects)”这么一个概念。这里我直接摘录C++11标准《ISO/IEC 14882:2011》,§ 20.8.1 Definitions: A callable type is a function object type (20.8) or a pointer to member. A callable obje...
这篇文的草稿我是在2014年5月11号开始打的,可是拖拖拉拉直到现在才真正动笔写,自己对自己也是醉了。。 之所以写bind而不是什么其他的东西,是因为bind在各种C++的utility里面可以说是最能体现出“利用语言本身来拓展语言功能”这一特...
1. 内存对齐(Data Structure Alignment)是什么 内存对齐,或者说字节对齐,是一个数据类型所能存放的内存地址的属性(Alignment is a property of a memory address)。 这个属性是一个无符号整数,并且这个整数必须是2的N次方(1、...
群里有个朋友要实现这么一个功能:如何在编译期把一个函数类型的参数减少一个。 简单来说,就是实现下面这个模板: remove_func_par::type; // type = void(int, long) 根据输入的编译期整数,把函数参数表里对应的参数干掉一个。 为...
地球人都知道C++里有一个typeid操作符可以用来获取一个类型/表达式的名称: std::cout
在C++98/03的泛型编程中,模板实例化有个很恼人的地方。那就是连续的两个右尖括号(>>)会被编译器解释成右移操作符,而不是模板参数表的结束。 让我们来看看下面这个例子: template struct Foo { typedef T type; }; template...
拖了又拖,终于痛下决心写这篇文了……因为自己太懒,博客里的内容一直捉襟见肘,实在是说不过去啊。 闲话少叙,还是赶快进入正题吧。 话说在C++里一直有一个比较头疼的问题,那就是在函数调用函数的时候,如何正确的传递参数。 考虑下...
大凡编程语言,都会有“函数”这个概念。而对于外部而言,一个函数最重要的部分就是它的返回值了。 说到这里,返回值其实应该是一个很简单的话题。当需要通过函数传递一个值出去的时候,使用返回值不是理所当然的嘛,比如说,像下面这样...