如何在c++20中静态_断言类型是可行的模板非类型参数。

问题描述 投票:0回答:1

我有一个类型 TimeDuration. 现在是 文字型 而我可以把它作为非类型模板参数使用。这样的用法与类型定义相去甚远(编译方面),所以如果有人修改了 TimeDuration 这样,它是不孤独的字面意思,它将被注意到得多。

所以我把 static_assert(std::is_literal_type_v<TimeDuration>); 就在类定义之后。然而, is_literal_type 在c++20中被删除了。我可以用什么来代替呢?

我知道 在C++17中废弃的std::is_literal_type。但答案基本上说我的问题不存在。

templates constexpr c++20
1个回答
2
投票

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

你可以很容易地在某个地方写一个小模板,然后用你的类型显式地实例化它。类似于:

template<auto val> struct checker{};

template struct checker<MyType(/*insert params for constexpr function here*/)>;

is_literal_type 反正是不合适的(这就是为什么它要消失的原因),因为作为一个字面类型并不像C++20的用户定义NTTP规则那样有限制性。是的,一个用户定义的NTTP必须是一个文字类型,但它也必须有一些其他的品质。


0
投票

如果你不在乎模板签名的统一性(避免std::is_same与类),你可以简单地通过const引用传递一个TimeDuration变量(或者任何你想要的东西)。

template <const auto& TimeDurationRef>
requires std::is_same_v<std::decay_t<decltype(TimeDurationRef)>, TimeDuration>
void foo();// or struct Foo {};

但是你不能传递即时的时间变量。你需要将引用的变量声明为静态constexpr,以确保静态存储持续时间。

© www.soinside.com 2019 - 2024. All rights reserved.