2

这样做更好吗:

const int MY_CONST = 20; // global constant in the program
class A {
    // uses MY_CONST all over the class implementation and definition
}

或这个?

const int MY_CONST = 20; // global constant in the program
template<int my_const>
class A {
    //uses my_const only and never MY_CONST
};

//A<MY_CONST> used later in the program

这些模式中的一种是否比另一种更好?为什么?谢谢

4

4 回答 4

3

除非该全局常量在类之外的其他地方使用,否则我不会使用这些方法中的任何一种,并使常量成为A

class A {
public:
    static const int MY_CONST = 20;
};

const int A::MY_CONST; // Possibly need definition also

然后A::MY_CONST在您的代码中使用。

我唯一会使用模板的时候是当您出于某种原因需要根据实例更改值时。

template <int I>
class A
{
public:
    static const int MY_CONST = I;
};

template <int I>
const int A<I>::MY_CONST; // Definition

然后像这样创建实例:

A<1> a1;
A<2> a2;
于 2012-09-06T20:43:06.623 回答
2

A<MY_CONST + 1>如果实例化例如、 或A<0>或除 之外的任何其他值有意义,则第二种解决方案是明智的MY_CONST。但是,如果A严格设计为与一个值一起使用,那么您不会从中获得任何收益。在这方面,第一个解决方案可为您提供所需的一切。

于 2012-09-06T20:39:27.000 回答
0

我总是会删除全局变量。让我们区分2种情况,MY_CONST要么

一个实现细节,在这种情况下,我宁愿将其设为私有常量

class A
{
private:
    static int const MY_CONST = 20;
};

类接口的一部分,在这种情况下,我更愿意将其设为模板参数并将其作为公共成员提供

template<int N>
class A
{
public:
    static int const MY_CONST = N;
};

这样,用户不仅可以读取,还可以“写入”(在编译时)到MY_CONST. 如果用户不想为 指定默认值N,您可以提供默认模板参数,或提供简单的 typedef

typedef A<20> DefaultA;
于 2012-09-06T21:43:15.143 回答
0

一种看待它的方法是,您正在引入对A(仅对数字,而不是任何具有行为的事物,但仍然是一种依赖关系)的依赖关系,问题是是否通过模板参数注入该依赖关系,或者让类通过命名的 const 对象引入依赖项。

我可以看到该模板对于测试类很有用A——您希望编写类以使用任何值,这样您就可以在将来更改该值,确信您不会立即遇到测试失败并且必须修复错误。

因此,您可以编写模板并使用许多不同的值对其进行测试,即使没有“真正的”程序会使用多个模板实例。

显然,还有其他方法可以编写行为取决于整数值的类,并对其进行测试。例如,您可以使用宏并让测试工具多次编译代码,或者您可以创建MY_CONST一个外部值并将代码链接到包含不同值的不同目标文件,或者您可以A将该值存储为数据成员(甚至静态数据成员)。

哪些对您有用取决于类将如何使用该值,但由于模板参数是一个整数常量表达式,因此它适用于大多数用途const int。您不能获取模板参数的地址,这是唯一立即浮现在脑海中的东西。

于 2012-09-06T21:34:07.013 回答