使用左值引用作为非类型模板参数

Kam*_*Kam 3 c++ templates

我读到以下类型可以作为非类型模板参数:

  • 整数类型
  • 枚举
  • 指向对象/方法
  • 对对象/方法的左值引用
  • std :: nullptr_t

我不明白如何使用非常量指针或左值引用?它们不是常量类型,以便在编译时识别它们吗?

显然,我不比标准聪明,所以有人可以给我看一个左值引用的示例,以及一个用作非模板参数的指针吗?

ric*_*ici 5

这是一个同时具有方法指针和左值引用作为非类型模板参数的示例:

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;
}
Run Code Online (Sandbox Code Playgroud)

coliru上看到它。

Deleter该类的有趣之处在于它没有实际的数据成员。可以直接内联其析构函数,而无需间接函数调用。

正如Dalibor Frivaldsky在评论中提到的那样,关键是(实例化的)函数delete_counter<int&>和计数器本身具有在编译时已知的固定地址,因此指针的值是恒定的。特别是,这仅适用于具有静态生存期的对象。自动(“堆栈分配”)对象将不起作用,非静态类成员也将不起作用,但是静态对象(如上所述)和静态类成员都很好。