gpt4 book ai didi

c++ - 概念是否需要 constexpr 值或函数?

转载 作者:行者123 更新时间:2023-11-30 03:23:25 25 4
gpt4 key购买 nike

所以,我想做一些高级的类型级黑客,为此我真的很想能够编写一个概念,要求类型具有与之关联的 constexpr int 值,稍后我可以在与整数 std::array 模板参数相同的概念中使用它。

可以这么写

template<typename T>
concept bool HasCount = requires {
typename T::count;
};

但这不是我想要的;我希望 T::count 成为一个 static constexpr int。但是,代码(甚至不包括所需的 constexpr)

template<typename T>
concept bool HasCount = requires {
int T::count;
};

在 GCC 7.3.0 上不编译时出现“错误:‘int’之前的预期主表达式”。

另一个失败的尝试:可以这样写,这需要static int T::count():

template<typename T>
concept bool HasCount = requires {
{T::count()} -> int;
};

但不是这个,这是我想要的:

template<typename T>
concept bool HasCount = requires {
{T::count()} -> constexpr int;
{T::count() constexpr} -> int; // or this
{constexpr T::count()} -> int; // or this (please forgive me for fuzzing GCC instead of reading the manual, unlike perl C++ is not an empirical science)
};

所以,我想知道是否有可能以任何方式要求概念表达式是 constexpr 限定的,或者如果不是,是否有不可能的原因,或者它是否不包含在规范。

最佳答案

理论上,这可以通过要求 T::count 是一个有效的表达式,并要求在以下上下文中使用 T::count 是有效的需要一个常量表达式。例如:

#include <type_traits>
#include <utility>

template<int> using helper = void;

template<typename T>
concept bool HasCount = requires {
// T::count must be a valid expression
T::count;
// T::count must have type int const
requires std::is_same_v<int const, decltype(T::count)>;
// T::count must be usable in a context that requires a constant expression
typename ::helper<T::count>;
};

struct S1 {
static constexpr int count = 42;
};
static_assert(HasCount<S1>);

struct S2 {
int count = 42;
};
static_assert(!HasCount<S2>);

struct S3 {
static constexpr double count = 3.14;
};
static_assert(!HasCount<S3>);

但实际上,the implementation of concepts in GCC rejects this program :

<source>:20:16: error: invalid use of non-static data member 'S2::count'
static_assert(!HasCount<S2>);
^~~~~~~~~~~~
<source>:18:17: note: declared here
int count = 42;
^~
<source>:20:16: error: invalid use of non-static data member 'S2::count'
static_assert(!HasCount<S2>);
^~~~~~~~~~~~
<source>:18:17: note: declared here
int count = 42;
^~

(哪个事实 I believe to be a bug .)

关于c++ - 概念是否需要 constexpr 值或函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50364722/

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