Closed. This question needs details or clarity 。它目前不接受答案。
想改善这个问题吗?添加细节并通过 editing this post 澄清问题。
6年前关闭。
Improve this question
我读到允许以下类型作为非类型模板参数:
整数类型 枚举 指向对象/方法的指针 对对象/方法的左值引用 std::nullptr_t
我不明白如何接受非常量指针或左值引用?它们不应该是常量类型以便在编译时识别它们吗?
显然我并不比标准更聪明,所以有人可以向我展示一个左值引用的例子,也许一个指针被用作非模板参数?
在 coliru 上查看。
正如 Dalibor Frivaldsky 在评论中提到的,重点是(实例化的)函数
想改善这个问题吗?添加细节并通过 editing this post 澄清问题。
6年前关闭。
Improve this question
我读到允许以下类型作为非类型模板参数:
我不明白如何接受非常量指针或左值引用?它们不应该是常量类型以便在编译时识别它们吗?
显然我并不比标准更聪明,所以有人可以向我展示一个左值引用的例子,也许一个指针被用作非模板参数?
最佳答案
这是一个示例,它同时具有方法指针和左值引用作为非类型模板参数:
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 上查看。
Deleter
类的有趣之处在于它没有实际的数据成员;它的析构函数可以直接内联而无需间接函数调用。正如 Dalibor Frivaldsky 在评论中提到的,重点是(实例化的)函数
delete_counter<int&>
和计数器本身具有在编译时已知的固定地址,因此指针的值是常量。特别是,这仅适用于具有静态生命周期的对象;自动(“堆栈分配”)对象不起作用,非静态类成员也不起作用,但静态对象(如上)和静态类成员就可以了。关于c++ - 使用左值引用作为非类型模板参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26124797/