constexpr举例
时间: 2023-07-18 13:40:06 浏览: 150
下面是一个使用`constexpr`的示例,计算斐波那契数列的第n项:
```c++
#include <iostream>
constexpr int fibonacci(const int n)
{
return (n == 0 || n == 1) ? n : (fibonacci(n - 1) + fibonacci(n - 2));
}
int main()
{
constexpr int n = 10;
constexpr int result = fibonacci(n);
std::cout << "斐波那契数列的第" << n << "项为:" << result << std::endl;
return 0;
}
```
在上面的示例代码中,使用`constexpr`关键字声明了一个名为`fibonacci`的函数,用于计算斐波那契数列的第n项。在`fibonacci`函数体中,使用三目运算符判断n是否等于0或1,如果是则直接返回n,否则递归计算n-1和n-2的斐波那契数列值之和。
在`main`函数中,定义了一个常量`n`,并使用`constexpr`计算出了斐波那契数列的第n项。需要注意的是,`n`必须是在编译时即可确定的常量表达式,否则程序将无法通过编译。
通过使用`constexpr`关键字,可以让编译器在编译时计算斐波那契数列的第n项,从而提高程序的效率。
相关问题
C++ explicit使用详细举例
C++中的`explicit`关键字用于声明构造函数,它强制要求只有明确指定类型的实例化才能通过该构造函数创建对象,防止隐式类型转换造成的意外行为。这里有两个例子来展示`explicit`的用法:
**例子1: 使用迭代器遍历vector 示例**[^1]
```cpp
#include <iostream>
#include <vector>
class VectorIterator {
public:
explicit VectorIterator(std::vector<int>::iterator it) : iterator(it) {}
private:
std::vector<int>::iterator iterator;
};
void print_vector(const std::vector<int>& vec) {
VectorIterator vi(vec.begin());
for (; vi.iterator != vec.end(); ++vi.iterator)
std::cout << *vi.iterator << " ";
}
int main() {
std::vector<int> vec = {1, 2, 3};
print_vector(vec);
return 0;
}
```
在这个例子中,`VectorIterator`类有一个显式的构造函数,只接受`std::vector<int>::iterator`类型的参数,不能通过其他类型的迭代器。
**例子2: 使用nullptr的示例**
```cpp
#include <iostream>
// 显式构造函数,仅接受char*类型
template<typename T>
void consume(T value) {
if constexpr (std::is_same_v<T, char*> && value == nullptr)
std::cout << "Consuming a null pointer.\n";
else
throw std::invalid_argument("Expected a null pointer");
}
int main() {
consume(nullptr); // 正确调用,因为是明确传递的char*类型
consume(0); // 抛出异常,尝试隐式转换无效
return 0;
}
```
在这个例子中,`consume`函数模板有显式的构造函数,如果传入`nullptr`,函数会正常执行;若试图用非null指针或其他类型调用,会引发异常。
如何通过模板元编程和宏实现属性的静态反射?实现代码举例
模板元编程和宏通常是在编译期间处理数据的一种技术,在某些编程语言(如C++和D)中可以用来实现属性的静态反射。静态反射允许你在运行前获取程序结构的信息,包括类的属性、方法等。
在C++中,你可以使用SFINAE(Substitution Failure Is Not An Error,即替换失败不是错误)原理和`sizeof`运算符来进行这种操作。例如,我们可以创建一个模板来检查特定类型的成员是否存在:
```cpp
#include <type_traits>
template <typename T, typename Member>
struct has_member {
static constexpr bool value = sizeof(std::declval<T>().*Member) != 0;
};
// 检查类A是否有一个名为myAttribute的public属性
template <typename A>
using has_my_attribute = has_member<A, decltype(&A::myAttribute)>;
// 使用例子
class A {
public:
int myAttribute;
};
static_assert(has_my_attribute<A>::value, "Class A does not have a 'myAttribute' member");
```
在这个例子中,如果`has_my_attribute<A>`的`value`为真,则说明`A`类有名为`myAttribute`的公共成员。
阅读全文