Я тут в этих самых "поисках" и пребываю, собственно. Очень, надо сказать, гадостная вешь. К примеру:
class Discount
{
// ...
public:
//
// Initializing constructor
// product - reference to Product object
// discount - discount (must be in percent)
Discount(const Business::Product &product, double discount)
{
// ...
}
};
Ключевые слова выделены и неоднократно обдуманы, ибо, как я уже говорил, вопрос довольно гнусный. Ну во-первых, "на уровне языка" не гарантируется то, что в
discount запишут именно семантически/логически верное значение скидки (в данном случае —
[0; 100]). И ладно бы если это ошибка пользователя — ее, в большинстве случаев, можно отловать и надавать по рукам. Программист и сам может ошибиться (и ошибется — полагаться на комментарии перед методом, мягко говоря, не стоит) — а это дебаггинг, тра-та-та.
Второе — это поддержка. Вот месяцев через
m открою я Solution, посмотрю на все эти числа, взгрустну... Ну, идея ясна. Может быть я преувеличиваю масштабы трагедии, но все же — в моем случае, по крайней мере — это актуально.
В общем, придумалось мне такое вот решение. Это, во-первых, только идея. Во-вторых, стало мне интересно, велосипед ли я изобрел или что.
template <class Type, long TypeDiscriminator>
class generic_unit
{
// Value type
typedef Type value_type;
// Value
value_type m_vValue;
public:
//
// Default public constructor
generic_unit(void) :
m_vValue(0)
{ }
//
// Explicit initializing constructor
explicit generic_unit(value_type vValue) :
m_vValue(vValue)
{ }
//
// Conversion to Type
operator Type (void) const
{ return m_vValue; }
};
Соответственно, с использованием сего "творения" предыдущий кусок кода перепишется как
// Разные TypeDiscriminator'ы - разные типы.
typedef generic_unit<double, 1> Percent;
typedef generic_uint<double, 2> NativeCurrency;
class Discount
{
// ...
public:
//
// Initializing constructor
// product - reference to Product object
// discount - discount (must be in percent)
Discount(const Business::Product &product, Percent discount)
{
// ...
}
};
Использует кто-нибудь что-нибудь подобное?
... << RSDN@Home 1.1.4 beta 4 rev. 303>>