Желательно, чтобы константы (например, определенные строки или числа) определялись в какой-то центральной точке. Чтобы сохранить читабельность кода, также желательно иметь легкий доступ к этим константам. Во время моего исследования передового опыта для достижения этой цели я нашел следующие два решения (https://stackoverflow.com/a/9649425/2776093).
FoodConstants.h:
namespace FoodConstants {
namespace Fruits {
extern const string Apple;
...
}
...
}
FoodConstants.cpp:
namespace FoodConstants {
namespace Fruits {
const string Apple = "apple" ;
...
}
...
}
FoodConstants2.h:
class FoodConstants {
public:
class Fruits {
public:
static const string Apple;
...
}
...
}
FoodConstants2.cpp:
const string FoodConstants::Fruits::Apple = "apple"
...
Для обоих решений я могу получить доступ к константе apple с помощью FoodConstants::Fruits::Apple в любом месте программы, где включен .h. Инициализация выполняется в той же единице компиляции, что позволяет избежать проблем с инициализацией. Я заметил одно отличие: для второго решения я не могу, например, выполнить «использование пространства имен FoodConstants», чтобы сократить доступ к строковой константе с помощью Fruits::Apple.
Есть ли другие отличия? Есть ли предпочтительный способ организации таких констант?
Fruits
является классом, вы можете передать его в качестве аргумента шаблона типа, чего нельзя сделать для пространств имен. - person Angew is no longer proud of SO   schedule 13.09.2013