Проверка наличия enum в компайл тайм.
От: koenjihyakkei Россия  
Дата: 26.08.15 23:18
Оценка:
Есть енам, содержимое которого генерится через Х макрос. В какой то момент может появиться итем в енаме с конкретным именем, нужно отловить этот момент. Есть ли какая-нибудь возможность это сделать? Буст не предлагать.

К примеру, если бы итем был макросом, а не енамом можно было бы сделать так:
#ifdef SOME_NEW_ENUM_ITEM
#error "ALARMA"
#else
// something code
#endif
Отредактировано 26.08.2015 23:26 koenjihyakkei . Предыдущая версия .
Re: Проверка наличия enum в компайл тайм.
От: szag  
Дата: 27.08.15 07:22
Оценка:
Здравствуйте, koenjihyakkei, Вы писали:

K>Есть енам, содержимое которого генерится через Х макрос. В какой то момент может появиться итем в енаме с конкретным именем, нужно отловить этот момент. Есть ли какая-нибудь возможность это сделать? Буст не предлагать.


по значению можно, есть такая возможность?
Re: Проверка наличия enum в компайл тайм.
От: uzhas Ниоткуда  
Дата: 27.08.15 07:31
Оценка:
Здравствуйте, koenjihyakkei, Вы писали:

K>В какой то момент может появиться итем в енаме с конкретным именем, нужно отловить этот момент.


гуглится
http://stackoverflow.com/questions/8597394/substitution-failure-is-not-an-error-sfinae-for-enum
Re: Проверка наличия enum в компайл тайм.
От: Кодт Россия  
Дата: 27.08.15 10:25
Оценка:
Здравствуйте, koenjihyakkei, Вы писали:

K>Есть енам, содержимое которого генерится через Х макрос. В какой то момент может появиться итем в енаме с конкретным именем, нужно отловить этот момент. Есть ли какая-нибудь возможность это сделать? Буст не предлагать.


Что-нибудь в таком роде
static_assert( is_same<decltype(REQUIRED_VALUE), THE_ENUM_TYPE>::value );

Проверяет, есть ли вообще имя REQUIRED_VALUE, является ли оно значением, и совпадает ли его тип с THE_ENUM_TYPE.
Перекуём баги на фичи!
Re[2]: Проверка наличия enum в компайл тайм.
От: enji  
Дата: 28.08.15 07:35
Оценка: +1
Здравствуйте, Кодт, Вы писали:


К>
К>static_assert( is_same<decltype(REQUIRED_VALUE), THE_ENUM_TYPE>::value );
К>

К>Проверяет, есть ли вообще имя REQUIRED_VALUE, является ли оно значением, и совпадает ли его тип с THE_ENUM_TYPE.


насколько я понял ТС, нужна ошибка, если REQUIRED_VALUE появится. А твой код будет давать ошибку, если его нет. Если нужно именно так, то можно сильно проще

void check() {
  REQUIRED_VALUE;
}
Re[2]: Проверка наличия enum в компайл тайм.
От: koenjihyakkei Россия  
Дата: 28.08.15 22:44
Оценка:
Здравствуйте, szag, Вы писали:

S>по значению можно, есть такая возможность?


Нет, только по имени.

enum {
  Foo1,
  Foo2,
  Foo3,
  Foo4,
  Foo5,
}

// it happens
enum {
  Foo1,
  Foo2,
  Foo3,
  NewFoo, // == value of old Foo4
  Foo4,
  Foo5,
}
Re[2]: Проверка наличия enum в компайл тайм.
От: koenjihyakkei Россия  
Дата: 28.08.15 22:50
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Что-нибудь в таком роде

К>
К>static_assert( is_same<decltype(REQUIRED_VALUE), THE_ENUM_TYPE>::value );
К>

К>Проверяет, есть ли вообще имя REQUIRED_VALUE, является ли оно значением, и совпадает ли его тип с THE_ENUM_TYPE.

То есть если
enum Enum {
  Foo1,
  Foo2,
  NewFoo,
  Foo3,
}

то
static_assert(is_same<decltype(NewFoo), Enum>::value
Так?
Но разве не будет ошибки компиляции если NewFoo еще нету?
Re[3]: Проверка наличия enum в компайл тайм.
От: Кодт Россия  
Дата: 28.08.15 23:17
Оценка:
Здравствуйте, koenjihyakkei, Вы писали:

K>Но разве не будет ошибки компиляции если NewFoo еще нету?


Я тебя неправильно понял. Думал, что тебе надо — наоборот, убедиться, что это имя попало в энум.
Перекуём баги на фичи!
Re[3]: Проверка наличия enum в компайл тайм.
От: Кодт Россия  
Дата: 28.08.15 23:37
Оценка: 5 (2)
Вот полное решение с белым и чёрным списком
http://ideone.com/9sRiJ9
#include <iostream>
#include <type_traits>
using namespace std;

// должно было быть enum E { A, Q, R };
// не должно быть enum E { X, Y, Z };
enum E { A, B, C, Z };
int R; // случайно определили вне энума

int Y;
// для тех имён, которые нигде не определены "по-настоящему", сделаем затычку
namespace last_chance { enum EE { X, Z }; }

void checker() {
    using namespace last_chance; // задействуем затычку
    
    // white list
    static_assert( std::is_same<::E, decltype(A)>::value, "A is not defined" );
    static_assert( std::is_same<::E, decltype(Q)>::value, "A is not defined" ); // ERROR
    static_assert( std::is_same<::E, decltype(R)>::value, "A is not defined" ); // ERROR
    
    // black list
    static_assert( !std::is_same<::E, decltype(X)>::value, "X is defined!" );
    static_assert( !std::is_same<::E, decltype(Y)>::value, "Y is defined!" );
    static_assert( !std::is_same<::E, decltype(Z)>::value, "Z is defined!" ); // ERROR
}


int main() {
    // your code goes here
    return 0;
}
Перекуём баги на фичи!
Re[4]: Проверка наличия enum в компайл тайм.
От: koenjihyakkei Россия  
Дата: 28.08.15 23:55
Оценка:
Здравствуйте, Кодт, Вы писали:

Ого, круто! Я честно говоря, и не думал, что возможно такое будет сделать) Ну ладно, теперь еще один пунктик, с которым, я думаю, точно будет невозможно — енам безымянный.
Re[5]: Проверка наличия enum в компайл тайм.
От: Кодт Россия  
Дата: 29.08.15 00:11
Оценка: 24 (3) +1 :)
Здравствуйте, koenjihyakkei, Вы писали:

K>Ого, круто! Я честно говоря, и не думал, что возможно такое будет сделать) Ну ладно, теперь еще один пунктик, с которым, я думаю, точно будет невозможно — енам безымянный.


Ха. http://ideone.com/tdl55S
enum { AT_LEAST_ONE_GOOD_ID, ..... };

.... is_same< decltype(INTERESTED_ID), decltype(AT_LEAST_ONE_GOOD_ID) > ....
Перекуём баги на фичи!
Re[6]: Проверка наличия enum в компайл тайм.
От: koenjihyakkei Россия  
Дата: 29.08.15 00:22
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Ха. http://ideone.com/tdl55S

К>
К>enum { AT_LEAST_ONE_GOOD_ID, ..... };

К>.... is_same< decltype(INTERESTED_ID), decltype(AT_LEAST_ONE_GOOD_ID) > ....
К>


Блин, ну точно же!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.