четверг, 17 декабря 2009 г.

Поиск разнотипных сравнений

(выношу из комментов)
henic@lj заинтересовался возможными решениями поиска разнотипных сравнений двух enum-ов в большой программе (Visual Studio).
Я ему предложил Александреску-style решение:
enum    E1 
{
V1,
V2
};

enum E2
{
V3,
V4
};

template <typename T1, typename T2>
bool operator==(T1 t1,T2 t2)
{
float a = "asd";
}

template <typename T1, typename T2>
bool operator!=(T1 t1,T2 t2)
{
float a = "asd";
}

int main()
{
E1 e1=V1;
E2 e2=V3;

if (e1==V2)
std::cout<<"+\n";
if (e1==V3)
std::cout<<"-\n";
if (e1!=e2)
std::cout<<"-\n";
if (e2==V4)
std::cout<<"+\n";
if (e2!=V2)
std::cout<<"-\n";
if (e2==e1)
std::cout<<"-\n";

return 0;
}

в строках где разнотипное сравнение VS2003 дает ошибку типа
main.cpp(235) : error C2440: 'initializing' : cannot convert from 'const char [4]' to 'float'
There is no context in which this conversion is possible
main.cpp(251) : see reference to function template instantiation 'bool operator !=<E2,E1>(T1,T2)' being compiled
with
[
T1=E2,
T2=E1
]
болдовая строка - как раз место сравнения
Если же разнотипных сравнений уже нет - все будет компилироваться без ошибок

по словам henic@lj-а решение оказалось эффективным: "Оппа... Какой паровоз других не совсем корректных сравнений эта штука мне нашла. :)"

0 comments:

Отправить комментарий