powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как сделать шаблон, у которого параметр- структура с потенциально разными полями?
14 сообщений из 14, страница 1 из 1
Как сделать шаблон, у которого параметр- структура с потенциально разными полями?
    #39578431
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть две структуры:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
struct A
{
int a;
static std::string Field(){return "a";}
};

struct B
{
int b;
static std::string Field(){return "b";}
};



Надо написать шаблонную функцию, которая может работать одновременно с двумя структурами (в таком варианте ругается, что у структуры А нет поля "b", и у структуры B нет поля "a"):
Код: plaintext
1.
2.
3.
4.
5.
template<class Type> FillStruct(Type CurrentStruct)
{
if(Type::Field() == "a") CurrentStruct.a = 42;
else (Type::Field() == "b") CurrentStruct.b = 42;
}



В реальности у меня порядка 10 структур, и у каждой по 5-6 полей, поэтому анализировать "пересечения" полей совсем не радует. Писать десяток однотипных функций тоже не хочется...

Как взлетит?
...
Рейтинг: 0 / 0
Как сделать шаблон, у которого параметр- структура с потенциально разными полями?
    #39578442
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLКак взлетит?

Выкинь шаблоны, структуры унаследуй от одной абстрактной с виртуальным методом FillStruct.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как сделать шаблон, у которого параметр- структура с потенциально разными полями?
    #39578475
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovВыкинь шаблоны, структуры унаследуй от одной абстрактной с виртуальным методом FillStruct.


А смысл? Ведь все затевалось, чтобы написать ОДИН метод обработки данных. А в твоем случае надо писать два оверайд метода...

p.s. С наступающим Новым Годом! :)
...
Рейтинг: 0 / 0
Как сделать шаблон, у которого параметр- структура с потенциально разными полями?
    #39578479
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLА смысл? Ведь все затевалось, чтобы написать ОДИН метод обработки данных.

Тогда не выпендривайся и давай одинаковым полям одинаковые имена.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как сделать шаблон, у которого параметр- структура с потенциально разными полями?
    #39578485
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovТогда не выпендривайся и давай одинаковым полям одинаковые имена.


Это разные поля :) У меня есть набор текстовых csv- файлов, которые с помощью регулярных выражений считываются построчно, но в одном случае нужны одни поля, а в другом- другие. Например, в одном случае я нахожу общую сумму в разрезе товаров, а в другом- количество клиентов по рынкам... Все эти поля являются "колонками" csv-файла, который я читаю регулярными выряжениями.

Очень не хочется для каждого случая писать похожие функции чтения текстовой строки регуляными выражениями и заполнения структуры.
...
Рейтинг: 0 / 0
Как сделать шаблон, у которого параметр- структура с потенциально разными полями?
    #39578510
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLОчень не хочется для каждого случая писать похожие функции чтения текстовой строки регуляными выражениями и заполнения структуры.
Ну тогда только union Вам поможет )
...
Рейтинг: 0 / 0
Как сделать шаблон, у которого параметр- структура с потенциально разными полями?
    #39578512
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ptr128AlekseySQLОчень не хочется для каждого случая писать похожие функции чтения текстовой строки регуляными выражениями и заполнения структуры.
Ну тогда только union Вам поможет )

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

поможет тем, что в одной переменной такого типа сможет содержаться как структура А, так и структура Б. Но не обе одновременно.
...
Рейтинг: 0 / 0
Как сделать шаблон, у которого параметр- структура с потенциально разными полями?
    #39578538
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL,

То что вы хотите реализуется через SFINAE.
https://en.wikibooks.org/wiki/More_C _Idioms/Member_Detector

Но скорее всего то, что вы хотите, не совпадает с тем, что вам надо ))

Например можно так:

Код: 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.
struct A
{
int a;
int& Field() {return a;}
};

struct B
{
int b;
int& Field() {return b;}
};


template<class Type> void FillStruct(Type& CurrentStruct)
{
    CurrentStruct.Field() = 42;
}
int main()
{
    A a;
    FillStruct(a);
    B b;
    FillStruct(b);
    return 0;
}
...
Рейтинг: 0 / 0
Как сделать шаблон, у которого параметр- структура с потенциально разными полями?
    #39578543
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky,

Спасибо, но полей много, поэтому решил в каждой структуре написать свой обработчик заполнения.
...
Рейтинг: 0 / 0
Как сделать шаблон, у которого параметр- структура с потенциально разными полями?
    #39578587
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
struct A
{
	int a;
};

struct B
{
	int a;
};

template<class Type> FillStruct(Type& CurrentStruct)
{
	CurrentStruct.a = 42;
}



другой вариант, использовать is_same . Во-первых, это отметёт часть кода на этапе компиляции, во-вторых, не надо будет лишних определителей типа, типа Field().
...
Рейтинг: 0 / 0
Как сделать шаблон, у которого параметр- структура с потенциально разными полями?
    #39578588
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL,

I. Можно через специализацию шаблона для каждой структуры (наверное, не самое удобное решение);
II. Можно через SFINAE -- заводите enum class FieldType для каждого типа поля, заводите соответсвующее поле в каждой структуре, типа static const FieldType fieldType = FieldType::A; , и через std::enable_if_t сужаете область для инстанциаций шаблонов для одного/нескольких значений, типа
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
template<class Type> 
std::enable_if_t<Type::fieldType == FieldType::A, void> FillStruct(Type CurrentStruct)
{
CurrentStruct.a = 42;
}

template<class Type> 
std::enable_if_t<Type::fieldType == FieldType::B, void> FillStruct(Type CurrentStruct)
{
CurrentStruct.b = 42;
}


То есть в разных структурах можно использовать одно и то же значение поля FieldType. Помните, что к значениям enum class'ов также применимы битовые операции, что можно использовать как битовые флаги в условиях при раскрытии шаблонов. Альтернативно
III. Стоит также взглянуть на if constexpr, если у Вас уже есть C++17. В этом случае, как раз можно было бы написать как Вы желаете
Код: plaintext
1.
2.
3.
4.
5.
template<class Type> FillStruct(Type CurrentStruct)
{
if constexpr(Type::fieldType == FieldType::A) CurrentStruct.a = 42;
else if constexpr (Type::fieldType == FieldType::B) CurrentStruct.b = 42;
}
...
Рейтинг: 0 / 0
Как сделать шаблон, у которого параметр- структура с потенциально разными полями?
    #39578603
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за кучу толковых советов!
...
Рейтинг: 0 / 0
Как сделать шаблон, у которого параметр- структура с потенциально разными полями?
    #39578668
д0kХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlekseySQLСпасибо за кучу толковых советов!
как вариант
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как сделать шаблон, у которого параметр- структура с потенциально разными полями?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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