[英]Which way of accessing C++ enumerators is better?
我正在尋找一些最佳實踐建議。 如果你有一個用C ++聲明的類,如下所示:
class Foo {
public:
enum { A, B, MAX};
};
是否應該訪問枚舉,如:
Foo::A
要么
Foo *var;
var->A;
直到今天,我總是訪問像Foo::A
這樣的常量值,而不是通過類類型的ptr。 事實上,我甚至不相信這是可能的。 有沒有人遇到過何時以及是否應該使用每個表格,還是應該堅持使用經過試驗和測試的Foo::A
方法?
編輯:讓Foo變成Foo * var這是一個錯字,因為大多數人都發現了感謝。
枚舉與類相關聯,而不是與實例相關聯。 所以Foo::A
更好。
據推測,您的示例應該聲明指針Foo * var
或者將枚舉數作為var.A
訪問。
如果你沒有可用的對象或指針,那么顯然“類”形式Foo::A
是唯一明智的選擇。
如果你這樣做,那么兩種形式都是等價的。 在我看來,“類”形式更具表現力,因為它匹配與類的關聯而不是對象。 它也可能與那些不相信它有效的人保存爭論。
在某些情況下(例如在模板中,或者使用auto
類型聲明的對象),類名可能很復雜甚至是未知的,在這種情況下,“對象”形式會更好:
template <typename T>
void f()
{
typename some::complicated::type::depending_on<T>::type var;
var.thing = var.A; // OK
var.thing = decltype(var)::A; // Ugly, requires C++11
var.thing = some::complicated::type::depending_on<T>::type::A; // Yuck!
}
第一個版本更好,就像@ KevinA.Naude所說。 如果您正在尋找一種方法來為enum
提供范圍,您可能需要查看C ++ 11 enum class
,它允許您使用enum class X {A, B, MAX};
等構造enum class X {A, B, MAX};
強制執行范圍 - 您將需要X::A
來引用它的內部。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.