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:
Отправить комментарий