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

Something like std::integral_constant but with auto template argument in std C++20 library?

从 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 std library中是否存在类似上述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 的任何模板。然而,它相当有限,因为它只适用于恰好采用这些参数的模板,而当类型和非类型参数可以混合时,正确处理一般情况是相当痛苦的。