gpt4 book ai didi

c++ 20 std::integral_constant?

转载 作者:行者123 更新时间:2023-12-03 06:49:04 29 4
gpt4 key购买 nike

我刚刚进入元编程,正在 youtube 上观看 Cppcon channel ,并看到了这个 std::integral_constant ,但找不到它的用途。
据我所知,这是一种将值与其类型一起“打包”的方法,它可以用

std::integral_constant<int, 42> i;
std::integral_constant<bool, true> b;
std::integral_constant<float, 3.14> f;
...
并且这些实例中的每一个都可以像它们包含的值一样使用,即:可以传递、用于数学运算、比较等。
但我不明白为什么我应该使用这些结构而不是实际包含的值,也不明白我是否可以在运行时实际访问值类型(即: intboolfloat )来处理它。
有人可以提供一个实际使用此功能的简单示例吗?一个解释它的用法与使用实际值的区别的例子?

最佳答案

std::integral_constant主要用作编写元编程特征的实用程序类型,特别是通过使用类型和值对类型进行编码。通过让自定义特征从 std::integral_constant 的特化继承我们可以通过静态成员常量 value 轻松地、惯用地访问存储的非类型模板参数。 ,以及例如该常量的值类型通过成员 typedef value_type .

例子std::integral_constant例如,可以用于为矩阵类型编写维度特征

using index_t = int;
template <index_t M, index_t N, typename S> struct mat {
// matrix implementation
};
作为
#include <type_traits>

// Default dimensionality 0.
template <class T, typename = void>
struct dimensionality : std::integral_constant<index_t, 0> {};

template <typename S>
struct dimensionality<S, std::enable_if_t<std::is_arithmetic_v<S>>>
: std::integral_constant<index_t, 1> {};

template <index_t M, index_t N, typename S>
struct dimensionality<mat<M, N, S>> : std::integral_constant<index_t, M * N> {};

template <class T>
inline constexpr index_t dimensionality_v = dimensionality<T>::value;
DEMO .
然而,一个更常见的用例是使用两个辅助类型定义 std::true_typestd::false_type对于常见情况,其中 Tbool .
Type        Definition
---- ----------
true_type std::integral_constant<bool, true>
false_type std::integral_constant<bool, false>

例如。作为
#include <type_traits>

struct Foo {};

template <typename T>
struct is_foo : public std::false_type {};

template<>
struct is_foo<Foo> : public std::true_type {};

template<typename T>
constexpr bool is_foo_v = is_foo<T>::value;

static_assert(is_foo_v<Foo>, "");
static_assert(!is_foo_v<int>, "");

关于c++ 20 std::integral_constant?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64302743/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com