LINUX.ORG.RU

История изменений

Исправление 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> {};

Но на каждую переменную такое не приделаешь.