我相信中的代码是<random>
一个很好的例子,但也不必盲目地遵循。在<random>
你看到这两种风格:
template<unsigned int TDIM> class MyClass
{
public:
static constexpr unsigned int size() {return _size;} // 1
static constexpr unsigned int dim = TDIM; // 2
private:
static const unsigned int _size = TDIM*3;
};
1 和 2 之间的选择很大程度上取决于风格。当以需要编译时结果的方式使用时,它们都会在编译时解析。你想让你的客户打字()
还是不打字?是否存在需要使用一种或另一种样式的通用代码?满足通用代码的要求是这里的关键。
关键字的使用在inline
这里没有影响。我认为它过于冗长,但如果您使用它,它不会造成任何伤害并且没有影响。
添加const
到返回类型不会在这里产生影响。我认为它过于冗长,但如果您使用它,它不会造成任何伤害并且没有影响。
如果您使用函数样式,但不要使用constexpr
:
static unsigned int size() {return _size;}
那么这个函数不能在编译时调用,因此不能在需要编译时常量的上下文中使用。如果您的应用程序或您的客户不需要此类功能,这可能不会对他们造成任何伤害。但是恕我直言,如果您有constexpr
工具箱,那么这是使用它的理想场所。如果你做一个未来的客户可以做这样的事情:
template <unsigned N> struct B {};
constexpr auto myclass = MyClass<3>();
// ...
// lots of code here
// ...
B<myclass.size()> b;
这两个是等价的:
static constexpr unsigned int dim = TDIM; // 2
static const unsigned int dim = TDIM; // 3
但这只是因为所涉及的类型是整数。如果类型不是整数,那么你必须使用constexpr
并且类型必须有一个constexpr
构造函数:
class A
{
unsigned _i;
public:
constexpr A(unsigned i) : _i(i) {}
};
template<unsigned int TDIM> class MyClass
{
public:
static constexpr unsigned int size() {return _size;}
static constexpr unsigned int dim = TDIM;
static constexpr A a = A(dim);
private:
static const unsigned int _size = TDIM*3;
};
这里的每个人,包括我自己,都还在学习如何使用constexpr
. 所以+1的问题。