LINUX.ORG.RU

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

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