Форум программистов, компьютерный форум, киберфорум
Наши страницы

Можно ли заменить обращение к Union без указания типа переменной? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Нужно разобраться с средой разработкой для C++ http://www.cyberforum.ru/cpp/thread1113231.html
Привет Всем ! Если я не ошибаюсь то с .NET 2003 (VS 7.1) шапки языка C++ немного изменился, и разница была следующая: 1. до: #include <iostream.h> void main(void) .........
C++ Libxl.h как подключить? Помогите подключить библиотеку к Visual C++ 2012 Или даже так - помогите разобраться с тем как парсить с xls файлов. http://www.cyberforum.ru/cpp/thread1111407.html
Ошибка с распределением цикла по потокам в Open MP C++
нужно цикл for разделить м/у потоками,но почему то ошибки выдает ,первый раз с Open MP работаю,подскажите как исправить ,пожалуйста... пишу на VS 2010 Ultimate ошибки:Ошибка 4 error C3004: shared:...
Надзиратель томагавков или что за велосипед я изобрел? C++
She's alive! Господа, в общем вдохновился я темой programina про статические поля класса и решил создать что-то похожее на сборщик мусора. По скольку я придерживаюсь мнения, что порою лучше сперва...
C++ Получение из файла формата wav массива значений http://www.cyberforum.ru/cpp/thread1108824.html
Столкнулся со следующей задачей, требуется получить из wav файла массив значений. Сам владею Си на примитивном уровне, по этой причине решить данную задачу самостоятельно не могу, поиск в гугле...
C++ Run exe from memory (x64) Есть необходимость запускать exe из памяти, а не с диска. Может кто сталкивался с данным проектом? Сам находил много проектов, но они были Win32 и не работали под сборкой x64. А мне нужен именно... подробнее

Показать сообщение отдельно
StailGot
28 / 23 / 6
Регистрация: 25.08.2013
Сообщений: 41
07.03.2014, 22:23
Цитата Сообщение от Izual Посмотреть сообщение
Что для этого надо сделать? Или есть под мои нужды альтернатива?
Можно реализовать оператор "приведения типа". Но тогда для функций типа
printf( "data.str : %s\n", data );
придется подсказывать явно, какой тип нужен.

Пример:
C++
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
 
using namespace std;
 
union data_t
{
  int i;
  float f;
  char str[42];
 
  operator int & ()
  {
    return i;
  }
 
  operator float & ()
  {
    return f;
  }
 
  operator char * ()
  {
    return str;
  }
 
};
 
void func( float val )
{
  cout << "func data.f: " << val << endl;
}
 
int main()
{
  data_t data;
 
  ( int )data = 10;
  printf( "data.i : %d\n", (int)data );
 
  ( float )data = 220.5f;
  printf( "data.f : %f\n", (float)data );
  func( data );
 
  sprintf( data, "data" );
  printf( "data.str : %s\n", (char *)data );
 
}

Тоже самое, более универсальное, хотя и опаснее:

C++
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
 
using namespace std;
 
union data_t
{
  int i;
  float f;
  char str[42];
 
  template<typename _Ty>
  operator _Ty * ()
  {
    return ( _Ty * )this;
  }
  template<typename _Ty>
  operator _Ty & ()
  {
    return *( _Ty * )this;
  }
 
  template<typename _Ty>
  _Ty operator=( _Ty val )
  {
    return ( _Ty ) * this = val;
  }
};
 
void func( float val )
{
  cout << "func data.f: " << val << endl;
}
 
int main()
{
  data_t data;
 
  data = 10;
  printf( "data.i : %d\n", (int)data );
 
  data = 220.5f;
  printf( "data.f : %f\n", (float)data );
  func( data );
 
  sprintf( data, "data" );
  printf( "data.str : %s\n", (char *)data );
 
  getchar();
}
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru