我读到以下类型允许作为非类型模板参数:
- 整数类型
- enum
- ptr 到对象/方法
- 对对象/方法的左值引用
- std::nullptr_t
我不明白如何接受非常量指针或左值引用?它们不应该是常量类型,以便在编译时被识别吗?
显然我并不比标准聪明,所以有人可以向我展示一个左值引用的示例,也许还有一个用作非模板参数的指针?
下面是一个示例,其中同时具有方法指针和左值引用作为非类型模板参数:
int delete_counter_1 = 0;
int delete_counter_2 = 0;
template<int& ctr>
void increment_counter() { ++ctr; }
template<void(*func)()>
class Deleter {
public:
~Deleter() { func(); }
};
int main() {
{ /* Internal scope */
Deleter<increment_counter<delete_counter_1>> a, b;
Deleter<increment_counter<delete_counter_2>> c;
}
std::cout << "Counter1: " << delete_counter_1
<< "; Counter2: " << delete_counter_2
<< '\n';
return 0;
}
看到它coliru http://coliru.stacked-crooked.com/a/8d7c409407f52d68.
有趣的是Deleter
类的特点是它没有实际的数据成员;它的析构函数可以直接内联,无需间接函数调用。
正如 Dalibor Frivaldsky 在评论中提到的,重点是(实例化的)函数delete_counter<int&>
并且计数器本身具有编译时已知的固定地址,因此作为指针它们的值是恒定的。特别是,这只适用于具有静态生命周期的对象;自动(“堆栈分配”)对象不起作用,非静态类成员也不起作用,但静态对象(如上所述)和静态类成员就可以了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)