从其他类访问非类型模板参数的最佳方式是什么

What is the best way to access non-type template parameters from other classes?

本文关键字:参数 最佳 方式 是什么 其他 访问 类型      更新时间:2023-10-16

我有一个容器类,代码的其他部分需要访问它的非类型模板参数。您不能使用::运算符访问非类型模板参数,那么获取这些值的首选方法是什么?

这个最小代码示例包含我所知道的三种方法:

#include <iostream>
template<int N>
struct Container 
{
    enum{Size = N};
    static const int m_size = N;
    constexpr int size() {return N;} //c++11
}; 
int main() {
    Container<42> c;
    //Output all three methods of getting N
    std::cout<< "::Size = " << Container<42>::Size << 'n';
    std::cout<< "m_size = " << c.m_size << 'n';
    std::cout<< "size() = " << c.size() << 'n';
}

用GCC-4.9编译(不足为奇)给出:

::Size = 42
m_size = 42
size() = 42

这三种方法都能工作,但在性能或编译器优化代码的能力方面有什么不同吗?

在我的特定应用程序中,非类型模板参数经常用于数组声明或算术函数。它们在编译时是已知的,但在设计时是未知的。因此,我希望编译器充分利用这些值是固定的信息,但我不想在源文件的深处对它们进行硬编码,因此可以选择模板参数。

解决方案大多与等效

  • enum是C++03方式(其类型不再是int
  • constexptr函数可以在运行时调用(在非constexpr上下文中)
  • 如果取地址,static const需要外部定义

不过,我会使用情况2的变体:

template<int N>
struct Container 
{
    static constexpr int m_size = N;
}; 

这里根本没有考虑性能。你可以测量它,但这三个程序都将以相同的方式编译的理由是很简单的。

就风格而言,我更喜欢static const int成员。不过,这真的完全取决于你。追求设计的一致性。