类似于 std::integral_constant 但在标准 C++20 库中具有自动模板参数?
Something like std::integral_constant but with auto template argument in std C++20 library?
从 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 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
的任何模板。然而,它相当有限,因为它只适用于恰好采用这些参数的模板,而当类型和非类型参数可以混合时,正确处理一般情况是相当痛苦的。
从 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 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
的任何模板。然而,它相当有限,因为它只适用于恰好采用这些参数的模板,而当类型和非类型参数可以混合时,正确处理一般情况是相当痛苦的。