【发布时间】:2021-03-30 09:04:46
【问题描述】:
考虑以下代码:
template<int complexity>
class Widget
{
public:
Widget(int size);
};
int main()
{
Widget<4> widget(12); // not easily readable if definition of Widget in some faraway header
return 0;
}
另一种尝试将枚举类型转换为命名参数:
enum ComplexityInt : int {};
enum SizeInt : int {};
template<ComplexityInt complexity>
class Widget
{
public:
Widget(SizeInt size);
};
int main()
{
Widget<(ComplexityInt) 4> widget((SizeInt) 12);
return 0;
}
第二个示例是否完全没有一些不良副作用或额外成本的 C++ 代码?从风格和可读性的角度来看,您对此有何看法?
【问题讨论】:
-
由于您只是将整数转换为一些没有实际命名值的枚举类型,因此我认为您的第二个示例没有任何好处。这两个例子都没有真正的意义,因为不清楚“小部件”是什么或这些值与它有何关系。我会选择使用较少代码的那个。
-
不要使用 C 风格的强制转换,在 C++ 中你会使用
Widget<ComplexityInt(4)>。what are your thoughts这个论坛力求客观,基于意见的问题是题外话。 -
@paddy,你可以在想象有很多数字参数的情况后尝试重新估计收益,并且参数更有意义,并且在某个遥远的标题中定义类,并且你正在不断发展和更改类定义,然后在程序的其他部分使用它。
-
我不必想象这样的情况。我在维护的一个大型项目中有一个。我有
template <int type> class Foo {};,我有一个带有实际名称的枚举。所以我有Foo<kMeaningulName>、Foo<kObvious>等。您还没有明确说明为什么不能在示例中使用名称。 -
@KamilCuk,你能指出一段我可以读到这种初始化的段落吗?在 cppreference.com 上,我只发现 “如果以下所有条件都为真,则可以使用列表初始化从一个整数初始化其基础类型固定的枚举类型,而无需强制转换...” (C++17 起)。
标签: c++ enums parameters named