C++ 如何在c+中断言类型对于模板非类型参数是可行的+;20

C++ 如何在c+中断言类型对于模板非类型参数是可行的+;20,c++,templates,c++20,constexpr,C++,Templates,C++20,Constexpr,我有一个类型TimeDuration。现在它是,我可以使用它作为非类型模板参数。这种用法与类型定义(编译方面)相去甚远,因此,如果有人修改TimeDuration,使其不再是单独的文本,那么它将在很久以后被注意到 所以我把static_断言(std::is_literal_type_v)紧跟在类定义之后。但是,c++20中删除了为文字类型的。我可以用什么来代替这个 我知道,但答案基本上是我的问题不存在 有一种非常简单的方法可以获得一个编译错误,该错误与类型是否适合在非类型模板参数中使用有关:在N

我有一个类型
TimeDuration
。现在它是,我可以使用它作为非类型模板参数。这种用法与类型定义(编译方面)相去甚远,因此,如果有人修改
TimeDuration
,使其不再是单独的文本,那么它将在很久以后被注意到

所以我把
static_断言(std::is_literal_type_v)紧跟在类定义之后。但是,c++20中删除了
为文字类型的
。我可以用什么来代替这个


我知道,但答案基本上是我的问题不存在

有一种非常简单的方法可以获得一个编译错误,该错误与类型是否适合在非类型模板参数中使用有关:在NTTP中使用它。如果不合适,编译器会抱怨

您可以在某个地方轻松地编写一个小模板,并使用您的类型显式地实例化它。比如:

template<auto val> struct checker{};

template struct checker<MyType(/*insert params for constexpr function here*/)>;
模板结构检查器{};
模板结构检查器;

is\u literal\u type
无论如何都不合适(这就是它消失的原因),因为作为一个literal类型并不像C++20的用户定义NTTP规则那样严格。是的,用户定义的NTTP必须是文本类型,但它还必须具有许多其他特性。

有一种非常简单的方法可以获得编译错误,即在非类型模板参数中使用类型是否合适:在NTTP中使用它。如果不合适,编译器会抱怨

您可以在某个地方轻松地编写一个小模板,并使用您的类型显式地实例化它。比如:

template<auto val> struct checker{};

template struct checker<MyType(/*insert params for constexpr function here*/)>;
模板结构检查器{};
模板结构检查器;

is\u literal\u type
无论如何都不合适(这就是它消失的原因),因为作为一个literal类型并不像C++20的用户定义NTTP规则那样严格。是的,用户定义的NTTP必须是文本类型,但它还必须具有许多其他特性。

如果您不关心模板签名的唯一性(避免std::与类相同),您只需通过const引用传递一个TimeDuration变量(或任何您想要的变量):

template <const auto& TimeDurationRef>
requires std::is_same_v<std::decay_t<decltype(TimeDurationRef)>, TimeDuration>
void foo();// or struct Foo {};
模板
需要标准::是否相同
void foo();//或结构Foo{};

但你不能在飞行中超越临时演员。您需要将引用的变量声明为static constexpr以确保静态存储持续时间。

如果您不关心模板签名的唯一性(避免std::与类相同),只需通过const引用传递TimeDuration变量(或任何您想要的变量):

template <const auto& TimeDurationRef>
requires std::is_same_v<std::decay_t<decltype(TimeDurationRef)>, TimeDuration>
void foo();// or struct Foo {};
模板
需要标准::是否相同
void foo();//或结构Foo{};

但你不能在飞行中超越临时演员。您需要将引用的变量声明为static constexpr,以确保静态存储持续时间。

非常简单的想法,谢谢!如果其他人尝试此功能,请记住此功能需要gcc-9+或clang-11+(或更高版本,clang-10不起作用)。非常简单的想法,谢谢!如果其他人尝试此功能,请记住此功能需要gcc-9+或clang-11+(或更高版本,clang-10不起作用)。作为参考,有一个简短的
std::has_strong_structural_equality
,但当重写类类型NTTPs并删除该术语时,该特性是故意的,部分原因是,它不明确它是否意味着“C++支持20”或“C++当前支持”。参考文献中,简要地说了“代码> STD::HasyStruthSuthalTalalIIAL < /COD>”,但是当类类型NTTPS被重写并且该术语被删除时,该特性是故意的,部分原因是,它不清楚它是否意味着“C++ 20支持”或“当前C++支持”。