gpt4 book ai didi

c++ - CONCEPT_REQUIRES_ ranges-v3 中的实现

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:23:06 24 4
gpt4 key购买 nike

试图学习如何使用 Eric Niebler 的 ranges-v3 库,并阅读源代码,我看到了宏定义:

#define CONCEPT_PP_CAT_(X, Y) X ## Y
#define CONCEPT_PP_CAT(X, Y) CONCEPT_PP_CAT_(X, Y)

/// \addtogroup group-concepts
/// @{
#define CONCEPT_REQUIRES_(...) \
int CONCEPT_PP_CAT(_concept_requires_, __LINE__) = 42, \
typename std::enable_if< \
(CONCEPT_PP_CAT(_concept_requires_, __LINE__) == 43) || (__VA_ARGS__), \
int \
>::type = 0 \
/**/

因此,简而言之,模板定义如下:

template<typename I, typename O,
CONCEPT_REQUIRES_(InputIterator<I>() &&
WeaklyIncrementable<O>())>
void fun_signature() {}

翻译为:

template<typename I, typename O,
int a_unique_name = 42,
typename std::enable_if
<false || (InputIterator<I>() &&
WeaklyIncrementable<O>()), int>::type = 0
>
void fun_signature() {}

我想知道为什么那个宏是这样实现的。为什么需要那个整数,为什么它需要一个 false || cond 而不仅仅是 cond 模板参数?

最佳答案

a template definition like ... is translated as ...

关闭。它实际上翻译为:

template<typename I, typename O,
int a_unique_name = 42,
typename std::enable_if
<a_unique_name == 43 || (InputIterator<I>() &&
WeaklyIncrementable<O>()), int>::type = 0
>
void fun_signature() {}

唯一命名的 int是为了确保 enable_if 的条件依赖于模板参数,以避免在模板定义时而不是在实例化时检查条件,以便 SFINAE 可以发生。考虑这个类定义:

template<class T>
struct S {
template<class U, CONCEPT_REQUIRES_(ranges::Integral<T>())>
void f(U);
};

没有注入(inject)唯一- int ,这个定义会降低到:

template<class T>
struct S {
template<class U, std::enable_if_t<ranges::Integral<T>()>>
void f(U);
};

ranges::Integral<T>()不依赖于此函数模板的参数,编译器将诊断出 std::enable_if_t<ranges::Integral<T>()> - 降低到 typename std::enable_if<ranges::Integral<T>()>::type - 格式错误,因为 std::enable_if<false>不包含名为 type 的成员.随着注入(inject)独特- int ,类定义降低为:

template<class T>
struct S {
template<class U, int some_unique_name = 42,
std::enable_if_t<some_unique_name == 43 || ranges::Integral<T>()>>
void f(U);
};

现在编译器无法对 enable_if_t 执行任何分析在模板定义时,自 some_unique_name是一个模板参数,可以指定为 43由用户。

关于c++ - CONCEPT_REQUIRES_ ranges-v3 中的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45887392/

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