История изменений
Исправление victor79, (текущая версия) :
Раздели cmd на две разные структуры. И функции будут принимать два разных типа.
Это то же самое, что strong types.
Я например такое иногда использую (или вариации):
template <class TT, class Tag>
struct UniqValT {
explicit UniqValT() {}
explicit UniqValT(TT val) : pValue(val + 1) {
assert( val < std::numeric_limits<TT>::max() );
}
bool operator < (const UniqValT& o) const { return pValue < o.pValue; }
bool operator == (const UniqValT& o) const { return pValue == o.pValue; }
explicit operator bool() const { return has(); }
TT value() const { return pValue-1; }
bool has() const { return !empty(); }
bool empty() const { return *this == UniqValT(); }
private:
TT pValue = 0;
};
а после пишется:
struct Size : public UniqValT<uint, struct Tag_Size> {};
и использование:
void doSomething2(Size sz) {}
void doSomething1(Size sz) { doSomething2(sz); }
...
doSomething1(Size(5));
Числовые значения тогда уже не туда не отправить. Но попытка приделать это к каждой переменной приведет к бесконечной доводке и оптимизации тестирования.
Исходная версия victor79, :
Раздели cmd на две разные структуры. И функции будут принимать два разных типа.
Это то же самое, что strong types.
Я например такое иногда использую (или вариации):
template <class TT, class Tag>
struct UniqValT {
explicit UniqValT() {}
explicit UniqValT(TT val) : pValue(val + 1) {
assert( val < std::numeric_limits<TT>::max() );
}
bool operator < (const UniqValT& o) const { return pValue < o.pValue; }
bool operator == (const UniqValT& o) const { return pValue == o.pValue; }
explicit operator bool() const { return has(); }
TT value() const { return pValue-1; }
bool has() const { return !empty(); }
bool empty() const { return *this == UniqValT(); }
private:
TT pValue = 0;
};
а после пишется:
struct Size : public UniqValT<uint, struct Tag_Size> {};
Но на каждую переменную такое не приделаешь.