Closed. This question needs details or clarity 。它目前不接受答案。












想改善这个问题吗?添加细节并通过 editing this post 澄清问题。

6年前关闭。



Improve this question




我读到允许以下类型作为非类型模板参数:
  • 整数类型
  • 枚举
  • 指向对象/方法的指针
  • 对对象/方法的左值引用
  • 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 上查看。
    Deleter 类的有趣之处在于它没有实际的数据成员;它的析构函数可以直接内联而无需间接函数调用。

    正如 Dalibor Frivaldsky 在评论中提到的,重点是(实例化的)函数 delete_counter<int&> 和计数器本身具有在编译时已知的固定地址,因此指针的值是常量。特别是,这仅适用于具有静态生命周期的对象;自动(“堆栈分配”)对象不起作用,非静态类成员也不起作用,但静态对象(如上)和静态类成员就可以了。

    关于c++ - 使用左值引用作为非类型模板参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26124797/

    10-11 23:08
    查看更多