Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Нужно разобраться с средой разработкой для C++ http://www.cyberforum.ru/cpp/thread1113231.html
Привет Всем ! Если я не ошибаюсь то с .NET 2003 (VS 7.1) шапки языка C++ немного изменился, и разница была следующая: 1. до: #include <iostream.h> void main(void) ...... и т.д... 2. после: #include <iostream>
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: предложение не допускается в директиве OpenMP "for" Ошибка 5 error C3017: неверный вид проверки завершения в операторе For директивы OpenMP #pragma omp parallel { #pragma omp for...
Надзиратель томагавков или что за велосипед я изобрел? C++
She's alive! Господа, в общем вдохновился я темой programina про статические поля класса и решил создать что-то похожее на сборщик мусора. По скольку я придерживаюсь мнения, что порою лучше сперва самому поковыряться, а потом уже почитать как правильно надо было сделать, то вот такой у меня получился уродец. Долго думал куда можно его применить в качестве примера. Придумал - класс-томагавк....
C++ Получение из файла формата wav массива значений http://www.cyberforum.ru/cpp/thread1108824.html
Столкнулся со следующей задачей, требуется получить из wav файла массив значений. Сам владею Си на примитивном уровне, по этой причине решить данную задачу самостоятельно не могу, поиск в гугле ничего не дал (или просто я не увидел решения). Надеюсь на вашу помощь.
C++ Run exe from memory (x64) Есть необходимость запускать exe из памяти, а не с диска. Может кто сталкивался с данным проектом? Сам находил много проектов, но они были Win32 и не работали под сборкой x64. А мне нужен именно x64, так как это проект будет использоваться в связки с другими 64-битными проектами. подробнее

Показать сообщение отдельно
StailGot
27 / 22 / 6
Регистрация: 25.08.2013
Сообщений: 41
07.03.2014, 22:23     Можно ли заменить обращение к Union без указания типа переменной?
Цитата Сообщение от 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();
}
 
Текущее время: 08:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru