powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как специализировать тип enum для шаблона?
18 сообщений из 18, страница 1 из 1
Как специализировать тип enum для шаблона?
    #38314002
manking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне нужно, чтобы в классе A, вызывались operator& которые не выводят "3". Ну то есть как написать перегруженный оператор который бы работал для всех enum.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
struct A
{
void operator&(int obj){std::cout << "\n1";}
void operator&(unsigned int obj){std::cout << "\n2";}

template<typename T>
void operator&(T & obj){obj.metod(); std::cout << "\n3";} 
};

enum enum__{AAA,BBB};
enum enum2__{AAA2,BBB2};

int main()
{
A a;
enum__ d = AAA;
a & d;

enum2__ e = AAA2;
a & e;

std::system("pause");
return 0;
}
...
Рейтинг: 0 / 0
Как специализировать тип enum для шаблона?
    #38314071
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
manking,

Начните с того что уберите obj.metod(); из шаблона.
Из-за него шаблон содержит ошибку (т.к. в enum нет никаких методов) и исключается из поиска среди доступных перегруженных операторов. (По стандарту С++, никаких ошибок не должно быть в этом случае - читайте про SFINAE)
...
Рейтинг: 0 / 0
Как специализировать тип enum для шаблона?
    #38314119
manking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskymanking,

Начните с того что уберите obj.metod(); из шаблона.
Из-за него шаблон содержит ошибку (т.к. в enum нет никаких методов) и исключается из поиска среди доступных перегруженных операторов. (По стандарту С++, никаких ошибок не должно быть в этом случае - читайте про SFINAE)

Мне нужно что бы этот перегруженный оператор не вызывался. Он для объектов(или для объектов можно указать особый?).
То есть указать такой operator& который бы вызывался для любых enum.
...
Рейтинг: 0 / 0
Как специализировать тип enum для шаблона?
    #38314137
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
manking,

Я не понял. Он что вызывается что-ли? Прямо вот так - с вызовом obj.metod() для enum?
...
Рейтинг: 0 / 0
Как специализировать тип enum для шаблона?
    #38314146
manking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskymanking,

Я не понял. Он что вызывается что-ли? Прямо вот так - с вызовом obj.metod() для enum?



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
struct A
{
void operator&(int obj){std::cout << "\n1";} // это для int
void operator&(unsigned int obj){std::cout << "\n2";} // это для unsigned int


template<typename T == enum> // здесь как бы тип должен быть enum
void operator&(T obj){ std::cout << "\nenum";}  // это для enum

template<typename T>
void operator&(T & obj){obj.metod(); std::cout << "\n3";}  // это для объектов

};
...
Рейтинг: 0 / 0
Как специализировать тип enum для шаблона?
    #38314160
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
manking,

Не надо пытаться объяснить что вы хотите на придуманном языке:
Код: plaintext
1.
template<typename T == enum>


- это не С++

Объясните по-русски, что вы получаете и что хотите получить.
Если приводите код, то это должен быть именно тот код который вы компилируете, а не набранный по памяти или придуманный на лету в редакторе форума.
...
Рейтинг: 0 / 0
Как специализировать тип enum для шаблона?
    #38314179
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

Я думаю что сделать шаблон который ловит все возможные enum нельзя (хотя наверно как-то можно извратиться с boost::is_enum).
Но вы можете сделать шаблон, который ловит конкретные enum.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
struct A
{
void operator&(int obj){std::cout << "\n1";}
void operator&(unsigned int obj){std::cout << "\n2";}

template<typename T >
void operator&(T obj)
{
    std::cout << "x\n";
}

};

enum enum__{AAA,BBB};
template<>
void A::operator&<enum__>(enum__ obj)
{
    std::cout << "enum__\n";
}

enum enum2__{AAA2,BBB2};

template<>
void A::operator&<enum2__>(enum2__ obj)
{
    std::cout << "enum2__\n";
}
...
Рейтинг: 0 / 0
Как специализировать тип enum для шаблона?
    #38314307
manking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyAnatoly Moskovsky,
Я думаю что сделать шаблон который ловит все возможные enum нельзя (хотя наверно как-то можно извратиться с boost::is_enum).
Но вы можете сделать шаблон, который ловит конкретные enum.


Я сейчас нашел, что так можно сделать с помощью
Код: plaintext
1.
#include <type_traits>

это из С++11.

там целая система для работы с шаблонами
Код: plaintext
1.
std::enable_if<std::is_enum<X>::value, void>::type



Где нибудь можно про это подробно почитать?
Потому что возможности вроде бы огромные.
...
Рейтинг: 0 / 0
Как специализировать тип enum для шаблона?
    #38314541
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
manking,

class enum ...
...
Рейтинг: 0 / 0
Как специализировать тип enum для шаблона?
    #38314546
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понял, ему нужна частичная специализация шаблона функции-члена operator & (двуместный) для определённых enum.

На самом деле для enum можно определить только для всех, поскольку это один тип данных -- int.
Для class enum из Cx11 можно.
...
Рейтинг: 0 / 0
Как специализировать тип enum для шаблона?
    #38314555
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

На самом деле, как видно из первого примера, у него перегрузки int не матчатся с enum, даже не смотря на то, что по правилам С++ сначала ищутся нешаблонные перегрузки, а уже потом шаблоны.

Это происходит потому, что enum это не int, а отдельный тип, который просто неявно приводится к int, наподобие как указатели неявно приводятся к bool.
...
Рейтинг: 0 / 0
Как специализировать тип enum для шаблона?
    #38314563
mankingAnatoly MoskovskyAnatoly Moskovsky,
Я думаю что сделать шаблон который ловит все возможные enum нельзя (хотя наверно как-то можно извратиться с boost::is_enum).
Но вы можете сделать шаблон, который ловит конкретные enum.


Я сейчас нашел, что так можно сделать с помощью
Код: plaintext
1.
#include <type_traits>

это из С++11.

там целая система для работы с шаблонами
Код: plaintext
1.
std::enable_if<std::is_enum<X>::value, void>::type



Где нибудь можно про это подробно почитать?
Потому что возможности вроде бы огромные.

В C++11 остался только std::enable_if
http://www.cplusplus.com/reference/type_traits/enable_if/

В boost их было много всяких
http://www.solarix.ru/for_developers/cpp/boost/utility/ru/enable_if.shtml

Ну и про SFINAE в интернетах посмотрите
http://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error

А возможности действительно большие!
...
Рейтинг: 0 / 0
Как специализировать тип enum для шаблона?
    #38314569
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyMasterZiv,

На самом деле, как видно из первого примера, у него перегрузки int не матчатся с enum, даже не смотря на то, что по правилам С++ сначала ищутся нешаблонные перегрузки, а уже потом шаблоны.

Это происходит потому, что enum это не int, а отдельный тип, который просто неявно приводится к int, наподобие как указатели неявно приводятся к bool.

По стандарту enum -- int, чтобы это обойти, в Cx11 и вводили class enum.
...
Рейтинг: 0 / 0
Как специализировать тип enum для шаблона?
    #38314574
MasterZivAnatoly MoskovskyMasterZiv,

На самом деле, как видно из первого примера, у него перегрузки int не матчатся с enum, даже не смотря на то, что по правилам С++ сначала ищутся нешаблонные перегрузки, а уже потом шаблоны.

Это происходит потому, что enum это не int, а отдельный тип, который просто неявно приводится к int, наподобие как указатели неявно приводятся к bool.

По стандарту enum -- int, чтобы это обойти, в Cx11 и вводили class enum.
Не похоже: http://ideone.com/MllyRY
авторis same enum A and int: false
is_enum:
int: false
enum A: true
class B: false
enum class C: true
decltype(C::alpha): true
Разница в том, что enum сам приводиться к int, а enum class обязательно надо приводить через static_cast.
...
Рейтинг: 0 / 0
Как специализировать тип enum для шаблона?
    #38314825
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivПо стандарту enum -- int
Ну присвойте какой-нибудь int в enum. Посмотрим, насколько это соответствует действительности.
...
Рейтинг: 0 / 0
Как специализировать тип enum для шаблона?
    #38319787
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyMasterZivПо стандарту enum -- int
Ну присвойте какой-нибудь int в enum. Посмотрим, насколько это соответствует действительности.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    enum teste { A1, A2, A3 };

    teste eVal = A3;
    int   iVal = 2;

    printf( "%d - %d", int(eVal), iVal );

    eVal = (teste)( iVal );

    printf( "%d - %d", int(eVal), iVal );
...
Рейтинг: 0 / 0
Как специализировать тип enum для шаблона?
    #38319796
LepsikAnatoly Moskovskyпропущено...

Ну присвойте какой-нибудь int в enum. Посмотрим, насколько это соответствует действительности.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    enum teste { A1, A2, A3 };

    teste eVal = A3;
    int   iVal = 2;

    printf( "%d - %d", int(eVal), iVal );

    eVal = (teste)( iVal );

    printf( "%d - %d", int(eVal), iVal );


Это называется static_cast.

А без него:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#include <stdio.h>
 
int main() {
    enum teste { A1, A2, A3 };
 
    teste eVal = A3;
    int   iVal = 2;
 
    printf( "%d - %d", int(eVal), iVal );
 
    //eVal = (teste)( iVal );
    //eVal = static_cast<teste>( iVal );
    eVal = iVal;
    
 
    printf( "%d - %d", int(eVal), iVal );
    return 0;
}


авторprog.cpp:13:12: error: invalid conversion from ‘ int ’ to ‘ main()::teste ’ [-fpermissive]
...
Рейтинг: 0 / 0
Как специализировать тип enum для шаблона?
    #38375779
enum и enum class
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
enum Te { e1, e2, e3};
enum class Tc { c1, c2, c3};

int main() {
    Te e = Te::e1;
    Tc c = Tc::c1;
    
    int i;
    i = e;
    e = static_cast<Te>(i);
    
    i = static_cast<int>(c);
    c = static_cast<Tc>(i);    
    
    return 0;
}
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как специализировать тип enum для шаблона?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]