从其他类访问非类型模板参数的最佳方式是什么
What is the best way to access non-type template parameters from other classes?
我有一个容器类,代码的其他部分需要访问它的非类型模板参数。您不能使用::运算符访问非类型模板参数,那么获取这些值的首选方法是什么?
这个最小代码示例包含我所知道的三种方法:
#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
成员。不过,这真的完全取决于你。追求设计的一致性。
相关文章:
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?
- 将移出参数的最佳做法
- 生成包含给定类型的 N 个参数的可变参数列表的最佳方法?
- 使用作为参数返回的指针的最佳做法是什么
- 最佳做法是在方法中传递参数
- 将不同类型的多种参数发送到处理方法的最佳方法.C
- 将对象数组作为参数传递的最佳方法是什么
- 在函数中使用 const 引用参数访问函数中成员的最佳实践 C++.
- 第一个进程保持运行而后续进程仅传递参数的最佳 IPC 方法是什么?
- 最佳实践C :多种方法的重用默认参数
- 处理 2+ 模板参数的最佳方法
- 在C 中传递多个函数参数的最佳实践
- 将结构分为函数参数列表的最佳方法
- std::shared_ptr语言 - 将共享指针作为参数传递的最佳做法
- 将函数作为参数传递的最佳方式
- 派生类方法的默认参数的最佳实践
- 返回转发引用参数 - 最佳做法
- 具有多个特征对象作为参数的函数的最佳实践
- Win32 DLL导出函数参数最佳实践