История изменений
Исправление dimgel, (текущая версия) :
т.е. нужен глобальный реестр кодов возврата (предполагаю, что как правило он есть) Ну и он особо ничего не упрощает.
А мне нравится:
enum class AllResultCodes {
AAA,
BBB,
CCC,
};
enum class FResult {
AAA = (int)AllResultCodes::AAA,
BBB = (int)AllResultCodes::BBB,
};
enum class GResult {
CCC = (int)AllResultCodes::CCC,
};
FResult f() { return FResult::AAA; }
GResult g() { return GResult::CCC; }
Правда задачу безопасного приведения FResult к GResult (если g() вызывает f()) эта фигня не решает. Чую, что решение есть, но думать лень.
UPD2: Например, можно нарисовать анализатор на clang libtooling, чтобы проверял, что если f()
делает return g()
, то элементы GResult
были бы подмножеством элементов FResult
. Гибко и не требует усложнения сорцов. И к слову, для работы такой проверки даже общий реестр кодов не нужен (хотя он нужен в самих сорцах, чтобы не получилось пересортицы).
UPD3: «если f()
делает return g()
» Точнее, натравливать libtooling на любые касты одного enum к другому.
Исправление dimgel, :
т.е. нужен глобальный реестр кодов возврата (предполагаю, что как правило он есть) Ну и он особо ничего не упрощает.
А мне нравится:
enum class AllResultCodes {
AAA,
BBB,
CCC,
};
enum class FResult {
AAA = (int)AllResultCodes::AAA,
BBB = (int)AllResultCodes::BBB,
};
enum class GResult {
CCC = (int)AllResultCodes::CCC,
};
FResult f() { return FResult::AAA; }
GResult g() { return GResult::CCC; }
Правда задачу безопасного приведения FResult к GResult (если g() вызывает f()) эта фигня не решает. Чую, что решение есть, но думать лень.
UPD2: Например, можно нарисовать анализатор на clang libtooling, чтобы проверял, что если f()
делает return g()
, то элементы GResult
был бы подмножеством элементов FResult
. Гибко и не требует усложнения сорцов. И к слову, для работы такой проверки даже общий реестр кодов не нужен (хотя он нужен в самих сорцах, чтобы не получилось пересортицы).
UPD3: «если f()
делает return g()
» Точнее, натравливать libtooling на любые касты одного enum к другому.
Исправление dimgel, :
т.е. нужен глобальный реестр кодов возврата (предполагаю, что как правило он есть) Ну и он особо ничего не упрощает.
А мне нравится:
enum class AllResultCodes {
AAA,
BBB,
CCC,
};
enum class FResult {
AAA = (int)AllResultCodes::AAA,
BBB = (int)AllResultCodes::BBB,
};
enum class GResult {
CCC = (int)AllResultCodes::CCC,
};
FResult f() { return FResult::AAA; }
GResult g() { return GResult::CCC; }
Правда задачу безопасного приведения FResult к GResult (если g() вызывает f()) эта фигня не решает. Чую, что решение есть, но думать лень.
UPD2: Например, можно нарисовать анализатор на clang libtooling, чтобы проверял, что если f()
делает return g()
, то элементы GResult
был бы подмножеством элементов FResult
. Гибко и не требует усложнения сорцов. И к слову, для работы такой проверки даже общий реестр кодов не нужен (хотя он нужен в самих сорцах, чтобы не получилось пересортицы).
UPD3: «если f()
делает return g()
»
Или может быть можно сделать какой-нить пустой оператор приведения одного enum к другому (или функцию, глобальный implicit-оператор чёт не похоже что получится), и натравливать libtooling конкретно на его вызовы не только при прямом делегировании, а вообще в любых контекстах.
Исправление dimgel, :
т.е. нужен глобальный реестр кодов возврата (предполагаю, что как правило он есть) Ну и он особо ничего не упрощает.
А мне нравится:
enum class AllResultCodes {
AAA,
BBB,
CCC,
};
enum class FResult {
AAA = (int)AllResultCodes::AAA,
BBB = (int)AllResultCodes::BBB,
};
enum class GResult {
CCC = (int)AllResultCodes::CCC,
};
FResult f() { return FResult::AAA; }
GResult g() { return GResult::CCC; }
Правда задачу безопасного приведения FResult к GResult (если g() вызывает f()) эта фигня не решает. Чую, что решение есть, но думать лень.
UPD2: Например, можно нарисовать анализатор на clang libtooling, чтобы проверял, что если f()
делает return g()
, то элементы GResult
был бы подмножеством элементов FResult
. Гибко и не требует усложнения сорцов. И к слову, для работы такой проверки даже общий реестр кодов не нужен (хотя он нужен в самих сорцах, чтобы не получилось пересортицы).
UPD3: «если f()
делает return g()
»
Или может быть можно сделать какой-нить пустой оператор приведения одного enum к другому, и натравливать libtooling конкретно на его вызовы не только при прямом делегировании, а вообще в любых контекстах.
Исправление dimgel, :
т.е. нужен глобальный реестр кодов возврата (предполагаю, что как правило он есть) Ну и он особо ничего не упрощает.
А мне нравится:
enum class AllResultCodes {
AAA,
BBB,
CCC,
};
enum class FResult {
AAA = (int)AllResultCodes::AAA,
BBB = (int)AllResultCodes::BBB,
};
enum class GResult {
CCC = (int)AllResultCodes::CCC,
};
FResult f() { return FResult::AAA; }
GResult g() { return GResult::CCC; }
Правда задачу безопасного приведения FResult к GResult (если g() вызывает f()) эта фигня не решает. Чую, что решение есть, но думать лень.
UPD2: Например, можно нарисовать анализатор на clang libtooling, чтобы проверял, что если f()
делает return g()
, то элементы GResult
был бы подмножеством элементов FResult
. Гибко и не требует усложнения сорцов. И к слову, для работы такой проверки даже общий реестр кодов не нужен (хотя он нужен в самих сорцах, чтобы не получилось пересортицы).
Исправление dimgel, :
т.е. нужен глобальный реестр кодов возврата (предполагаю, что как правило он есть) Ну и он особо ничего не упрощает.
А мне нравится:
enum class AllResultCodes {
AAA,
BBB,
CCC,
};
enum class FResult {
AAA = (int)AllResultCodes::AAA,
BBB = (int)AllResultCodes::BBB,
};
enum class GResult {
CCC = (int)AllResultCodes::CCC,
};
FResult f() { return FResult::AAA; }
GResult g() { return GResult::CCC; }
Правда задачу безопасного приведения FResult к GResult (если g() вызывает f()) эта фигня не решает. Чую, что решение есть, но думать лень.
Исходная версия dimgel, :
т.е. нужен глобальный реестр кодов возврата (предполагаю, что как правило он есть) Ну и он особо ничего не упрощает.
А мне нравится:
enum class AllResultCodes {
AAA,
BBB,
CCC,
};
enum class FResult {
AAA = (int)AllResultCodes::AAA,
BBB = (int)AllResultCodes::BBB,
};
enum class GResult {
CCC = (int)AllResultCodes::CCC,
};
FResult f() { return FResult::AAA; }
GResult g() { return GResult::CCC; }