类似于 std::integral_constant 但在 std C++20 库中有自动模板参数?

问题描述

从 C++20 开始,可以使用 auto 模板参数来实现整数常量:

Try it online!

template <auto Value>
struct integral_constant2
    : std::integral_constant<decltype(Value),Value> {};

可以用来代替具有两个模板参数的更详细的变体 std::integral_constant

当然更容易写出f(std::integral_constant2<123>{});而不是更冗长的f(std::integral_constant<int,123>{});。更重要的是,如果您有复杂的编译时表达式,您可能无法提前知道类型。

我的问题是 C++20 标准库中是否存在类似上面提到的 integral_constant2 的东西,而不是重新发明轮子?或者至少有一些 std constexpr 函数 std::make_integral_constant(123) 可以推导出 std::integral_constant 的模板参数?

解决方法

您可以在此处查看 C++20 中的所有新功能:https://en.cppreference.com/w/cpp/20

而且我没有看到任何与 integral_constant 相关的内容(我在 type_traits 页面中也没有看到任何内容)

,

不,我不知道有这样的替换。

我相信很难为这样的提议辩护,因为编写自己的提议是多么容易。另一方面,唯一的原因可能是还没有人提出。


主要是出于好奇,并扩展评论,您可以通过以下方式更进一步:

#include <type_traits>

template <auto Value,template<typename A,A> typename C>
using automized = C< decltype(Value),Value>;

template <auto Value>
using integral_constant = automized<Value,std::integral_constant>;

int main() {
    struct S {};
    integral_constant<true> c0{};
    integral_constant<10> c1{};
    integral_constant<S{}> c2{};
}

automized 将允许将 auto 参数转发到任何采用 typename T,T value 的模板。然而,它是相当有限的,因为它只适用于完全采用这些参数的模板,而当类型和非类型参数可以混合时,正确处理一般情况是相当痛苦的。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...