#c
Вопрос:
Представьте, что у меня есть структура C под названием Color
struct Color {
float r,g,b;
};
и функция, которая принимает цветной объект и что-то с ним делает:
void func(const Color amp; color) {...}
Обычно я вызываю эту функцию с помощью цветных объектов, построенных на лету:
func(Color{0.1,0.2,0.3});
Но есть определенные цвета, которые я часто использую, например, черный, белый и красный. Поэтому я часто ловлю себя на том, что делаю это:
func(Color{0.0,0.0,0.0}); // black
func(Color{1.0,1.0,1.0}); // white
func(Color{1.0,0.0,0.0}); // red
Вместо этого я хотел бы сделать следующее
func(Color::black);
func(Color::white);
func(Color::red);
Поэтому я ищу способ определения глобальных констант типа Color внутри пространства имен Color. До сих пор я пробовал эти два варианта:
Вариант 1. определите пространство имен с тем же именем, что и структура; не работает из-за конфликтующих пространств имен.
struct Color {
float r,g,b;
};
namespace Color {
const Color black{0.0,0.0,0.0};
const Color white{1.0,1.0,1.0};
const Color red{1.0,0.0,0.0};
}
Вариант 2: статические переменные внутри определения структуры; не работает, так как это делает определение структуры неполным.
// static members
struct Color {
float r,g,b;
static Color red = Color{1.0,0.0,0.0};
};
Есть ли способ достичь того, чего я хочу, или, по крайней мере, что-то подобное?
Комментарии:
1. Конечно, это возможно. В чем ваша конкретная проблема, с которой вы пытаетесь это сделать? Ошибки компоновщика?
2. Лучше использовать разные имена, такие как
namespace PredefinedColor
… Это облегчает понимание кода и делает его более удобным для таких инструментов, как Intellisense.
Ответ №1:
struct Color {
float r, g, b;
static const Color red;
};
constexpr Color Color::red{1.0,0.0,0.0};