C++20中支持将类类型作为非类型模板参数:作为模板参数传入的对象具有const T类型,其中T是对象的类型,并且具有静态存储持续时间(static storage duration)。
在C++20之前,非类型模板参数仅限于:左值引用类型、整数类型、指针类型、指向成员类型的指针、枚举类型、std::nullptr_t。在C++20中,它已扩展并支持:浮点类型、字面量类类型(literal class type)。
测试代码如下:
namespace {
template<int N> // int non-type template parameter
struct Array {
static_assert(N > 0, "N must be greater than 0");
int data[N];
};
template<float v> // c++20
void print_value()
{
static_assert(v < 0, "v must be less than 0");
std::cout << "v: " << v << std::endl;
}
// literal class type
struct Foo {
constexpr Foo() {}
constexpr Foo(int value): has_value(true), value(value) {}
const int value{};
const bool has_value{ false };
};
template <Foo f> // c++20
void print_foo() {
if constexpr (f.has_value)
std::cout << "value: " << f.value << std::endl;
else
std::cout << "no value" << std::endl;
}
} // namespace
int test_template_20()
{
Array<5> arr;
arr.data[3] = {6};
std::cout << "arr[3]: " << arr.data[3] << std::endl;
print_value<-1.1f>();
print_foo < Foo{ 66 } > ();
print_foo < Foo{} > ();
return 0;
}
执行结果如下图所示: