当前位置:   article > 正文

模板元编程 Template Metaprogramming--- C++ 20_c++20 模板元编程

c++20 模板元编程

模板元编程(一) Template Metaprogramming— C++ 20

在编译期进行类型操作

举个例子:

std::move在概念上应该这样实现(实际并不是这么做的):

static_cast<std::remove_reference<decltype(arg)>::type&&>(arg);
  • 1

意义上,std::move首先获取它的参数arg,推断出其类型,移除引用,最后转换为右值引用,移动语义就生效了.

如何移除参数的const呢?

#include <iostream>
#include <type_traits>

template <typename T>
struct removeConst
{
	using type = T; // (1)
};

template <typename T>
struct removeConst<const T>
{
	using type = T; // (2)
};

int main()
{
	std::cout << std::boolalpha;
	std::cout << std::is_same_v<int, removeConst<int>::type> << '\n'; // true    
	std::cout << std::is_same_v<int, removeConst<const int>::type> << '\n'; // true
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

std::is_same_v<int, removeConst<int>::type> 等同std::is_same<int, removeConst<int>::type>::value,其中::type表示编译器推断出来的模板类型

传入int时,应用removeConst

传入const int,应用removeConst<const T>,这样就移除了const,很好理解

Metadata

metadata是编译阶段元函数使用的数据

一共有三种类型:

  • 类型参数:int,double
  • 非类型参数,例如:数字类型,枚举类型…
  • 模板,例如std::vector

以后会详细解释这部分内容

Metafunctions

元函数是在编译期执行的函数

元函数:

template <int a , int b>
struct Product {
    static int const value = a * b;
};

template<typename T >
struct removeConst<const T> {
    using type = T;
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

函数 vs 元函数

#include <iostream>

int power(const int m, const int n)
{
	int r = 1;
	for (int k = 1; k <= n; ++k) r *= m;
	return r;
}

template <int M, int N>
struct Power
{
	static int const value = M * Power<M, N - 1>::value;
};


template <int M>
struct Power<M, 0>
{
	static int constexpr value = 1;
};

int main()
{
	std::cout << '\n';

	std::cout << "power(2, 10)= " << power(2, 10) << '\n';
	std::cout << "Power<2,10>::value= " << Power<2, 10>::value << '\n';

	std::cout << '\n';
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

image-20220522212804860

  • 参数:函数的参数在圆括号里面(...),元函数的参数在尖括号里面<...>

  • 返回值:函数返回一个语句,元函数返回一个静态常量值

    以后会介绍constexprconsteval

混合编程 Hybrid Programming

例子:

#include <iostream>

template <int n>
int Power(int m)
{
	return m * Power<n - 1>(m);
}

template <>
int Power<0>(int m)
{
	return 1;
}

int main()
{
	std::cout << '\n';

	std::cout << "Power<0>(10): " << Power<0>(20) << '\n';
	std::cout << "Power<1>(10): " << Power<1>(10) << '\n';
	std::cout << "Power<2>(10): " << Power<2>(10) << '\n';


	std::cout << '\n';
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

下一篇文章介绍


::cout << "Power<1>(10): " << Power<1>(10) << ‘\n’;
std::cout << "Power<2>(10): " << Power<2>(10) << ‘\n’;

std::cout << '\n';
  • 1

}


下一篇文章介绍

------

[What does “::value, ::type” mean in C++? - Quora](https://www.quora.com/What-does-value-type-mean-in-C)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/799469
推荐阅读
  

闽ICP备14008679号