问题描述
从 C++20 开始,可以使用 auto
模板参数来实现整数常量:
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
的模板。然而,它是相当有限的,因为它只适用于完全采用这些参数的模板,而当类型和非类型参数可以混合时,正确处理一般情况是相当痛苦的。