1500 / 964 / 811
Регистрация: 30.04.2016
Сообщений: 3,334
1

Поле класса в виде шаблона

09.03.2019, 21:03. Показов 1220. Ответов 12
Метки нет (Все метки)

Здравствуйте, уважаемые форумчане! Приходится считывать данные в общий массив (класс) из двух объектов с почти одинаковыми полями. Различается лишь одно поле. Вопрос: как объявить одно из полей принимающего класса в виде шаблона, чтобы одно поле такого класса могло принимать одновременно данные типа float и string? (остальные поля совпадают по типу данных). Можно небольшой пример, пожалуйста. Без наворотов, как можно проще, если получится.

P.S. Может быть, просто использовать вложенный класс с двумя полями как тип такого поля?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.03.2019, 21:03
Ответы с готовыми решениями:

задание реализовать в виде класса - шаблона
Друзья, осталось для зачета сделать одну лабу, а у меня не получается... Помогите, если вам не...

Определение метода-шаблона за пределами шаблона класса
День добрый! Разбираюсь в шаблонах, решил копнуть поглубже. Вот пример: template <typename T1>...

Явное создание экземпляра класса и явная специализация шаблона класса
Всем добрый день! Не могу разобраться - эти две технологии дают один и тот же результат? В каких...

Только константное статическое поле НЕ МОЖЕТ быть поле членом класса !
class CCoords { static const float rate = 1.0f; // ОШИБКА !!! bool IsComputed; ...

12
"C with Classes"
1581 / 1360 / 511
Регистрация: 16.08.2014
Сообщений: 5,647
Записей в блоге: 1
09.03.2019, 21:09 2
Цитата Сообщение от Fixer_84 Посмотреть сообщение
принимать одновременно данные типа float и string
одновременно в смысле в рантайме? это не к шаблонам. шаблон инстанцируется на этапе компиляции

Добавлено через 4 минуты
и после инстанцирования шаблона ты их в один массив не запишешь
0
1500 / 964 / 811
Регистрация: 30.04.2016
Сообщений: 3,334
09.03.2019, 21:11  [ТС] 3
_stanislav, мне нужно считывать данные в одно из полей класса по разным типам. То есть, чтобы одно из полей класса одно принимать как float так и double и записывать такие данные в это поле. Как это обычно реализуется?
0
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
09.03.2019, 21:12 4
Fixer_84,
C++
1
2
3
4
5
6
7
8
9
10
11
template <typename T>
struct Dummy {
    T   first_;
    int second_;
 
    Dummy(T const first, int const second) : first_(first), second_(second) {}
};
 
int main() {
    Dummy<float> d(3.14, 15);
}
Если верно понял
0
1500 / 964 / 811
Регистрация: 30.04.2016
Сообщений: 3,334
09.03.2019, 21:18  [ТС] 5
_stanislav, но ведь обычный шаблон может принимать и печатать данные разных типов. Почему тогда поле класса не может быть шаблоном?

Добавлено через 5 минут
Azazel-San, спасибо за ваш ответ. Мне нужно чтобы в вашем примере
C++
1
T first_;
могло быть как float, так и string (зависимости от типа). Это вообще возможно?
0
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
09.03.2019, 21:21 6
Цитата Сообщение от Fixer_84 Посмотреть сообщение
Это вообще возможно?
Оно может быть как флоат так и стринг, так и дабл и инт и будь чем
0
1500 / 964 / 811
Регистрация: 30.04.2016
Сообщений: 3,334
09.03.2019, 21:23  [ТС] 7
Azazel-San, то есть, у типа два поля, но одно из них шаблон, понимаете?
0
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
09.03.2019, 21:24 8
Fixer_84, можете дать минимально компилируемый (или нет) пример вашей проблемы (кодом)?
0
Don't worry, be happy
17758 / 10526 / 2030
Регистрация: 27.09.2012
Сообщений: 26,502
Записей в блоге: 1
09.03.2019, 21:34 9
Цитата Сообщение от Fixer_84 Посмотреть сообщение
Это вообще возможно?
В том виде, в котором Вы хотите - нет.
Почему весь класс не сделать шаблонным?
Цитата Сообщение от Fixer_84 Посмотреть сообщение
могло быть как float, так и string (зависимости от типа)
Если возможные типы заранее известны,
то можно использовать std::variant, если неизвестны, то std::any.
0
1500 / 964 / 811
Регистрация: 30.04.2016
Сообщений: 3,334
09.03.2019, 21:47  [ТС] 10
Croessmah, хорошо, пусть весь класс будет шаблонным. Но как это сделать? Как считать данные в такой класс?

Добавлено через 7 минут
Croessmah, что-то типа этого?

C++
1
2
3
4
5
6
7
8
template<class T> 
struct Z
{
    T val;
}; 
 
Z<int> a; 
Z<char> p;
Но как правильно создать объект такого класса? Как присвоить его полям значения? Можно небольшой пример?
0
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
09.03.2019, 21:49 11
Fixer_84,
C++
1
2
Z<int> a{12}; 
Z<char> p{'c'};
0
1500 / 964 / 811
Регистрация: 30.04.2016
Сообщений: 3,334
09.03.2019, 21:54  [ТС] 12
Вообщем я думаю, что лучше покажу саму задачу:

Вот файл 1:

C++
1
2
3
Cars Russia 50 5-10
Dolls Russia 100 2-7
Balls Russia 150 1-4
Вот файл 2:

C++
1
2
3
Pencakes Russia 100 500
Milk Russia 200 500
Meat Russia 300 500
Мне нужно считать оба файла в один массив, но поле 4 для каждой записи различно. В файле один - это string, в файл 2 - это integer. Потом эти данные нужно обрабатывать (сортировать, выводить и т.д.). Как это можно сделать правильно?

P.S. Считывать поле integer как string и конвертировать в integer? Другого выхода нет?
0
Комп_Оратор)
Эксперт по математике/физике
8727 / 4473 / 601
Регистрация: 04.12.2011
Сообщений: 13,362
Записей в блоге: 16
09.03.2019, 22:23 13
Fixer_84, как только вы попробуете представить то как вы будете использовать то о чём пытаетесь сказать, поймёте, что есть не так уж и много всеядных классов, которые это умеют. Поток стандартного вывода например. Но работать даже с ним - именины сердца. Вот вам на ночь:
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
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include <string>
using namespace std;
 
struct TwoFaceAnus
{
    enum Current_type{Float_t, String_t, unknown_t};
    Current_type current_type;
 
    void * tfa;
 
    TwoFaceAnus():tfa(0),current_type(unknown_t){}
 
    TwoFaceAnus(float _a){
current_type=Float_t;
tfa=new float(_a);
    }
 
    TwoFaceAnus(string _a){
current_type=String_t;
tfa=new string(_a);
    }
 
    float get_float()
    {
        if(current_type!=Float_t)
            throw("nofloat"); 
        else return *(static_cast<float*>(tfa));
    }
 
 
    string get_string()
    {
        if(current_type!=String_t)
            throw("nostring"); 
        else return *(static_cast<string*>(tfa));
    }
~TwoFaceAnus()
{
    if(tfa)
    {
        if(current_type==Float_t) delete static_cast<float*>(tfa);
        if(current_type==String_t) delete static_cast<string*>(tfa);
 
    }
}
};
 
int main(int argc, char* argv[])
{
TwoFaceAnus fl_anus(123e-2);
TwoFaceAnus str_anus("2-yanus");
try{
cout<<fl_anus.get_float()<<' '<<str_anus.get_string()<<endl;//главное ничего не перепутать
}
catch(const exception & e){cout<<e.what()<<endl;}
cin.get();
return 0;
}
но не пейте перед сном много воды.
Есть варианты играть с памятью и по другому, но всё это будут такие же костыли.
В крайнем случае можно отнаследовать от базового и получать доступ по указателю. Но даже, если используя auto вам удастся что-то получить, то придумать как это использовать без постоянного получения типа и выбора ветви алгоритма не получится. Любой код на ява или шарпе будет быстр и на вид красив, в сравнении с подобным.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.03.2019, 22:23
Помогаю со студенческими работами здесь

Представить в виде шаблона
#include &lt;iostream&gt; using namespace std; int main() { int n; int num; int sum =...

Массив объектов одного класса как поле другого класса
Доброе время суток. Мне тут в универе задали лабу, нужно создать класс полем которого будет массив...

Программа в виде шаблона функции
помогите оформить программу в виде шаблона функции, пожалуйста! #include &lt;iostream&gt; using...

Инициализация экземпляра класса, как поле другого класса
Всем доброго времени суток ! Есть класс: class a{ public: a(int _type): type(_type) {} ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru