функции шаблона, как отправить различные структуры и создать оператор if / else на основе типа? - PullRequest
1 голос
/ 02 ноября 2010

Я пытаюсь создать шаблонную функцию общего назначения, которая должна функционировать с двумя различными типами структур. Я напишу пример

struct sa {
int a;
int b;
char d;
}
struct sb {
int a;
int b;
int c;
}

template < class T>
void f_print(T & s_passed, bool s_typeB){
std::cout << s_passed.a << endl ;
std::cout << s_passed.b << endl ;
if(s_typeB == false){
std::cout << s_passed.d << endl ;
}else{
std::cout << s_passed.c << endl ;
}
}

, затем на основном:

{
struct  sa str_TEST_A ;
struct  sb str_TEST_B ;

f_print(str_TEST_A,false);
f_print(str_TEST_B,true);
}

теперь это краткий пример моей проблемы, когда я работаю с гораздо более сложными структурами, в любом случае, я получаю сообщение об ошибке: у 'struct sa' нет члена с именем 'd'

проблема в том, чтоКомпилятор gnu c ++ не распознал, что не все операции в функции выполняются при передаче struct sa, и d печатается только при передаче sb, как я могу это исправить, не создавая дублированную функцию 1 для каждого типа структуры?

спасибо :) Франческо

Ответы [ 4 ]

4 голосов
/ 02 ноября 2010

Вы можете перемещать специализированные детали в отдельные функции и вызывать их из вашего общего шаблона:

void f_print_special(sa & s_passed) {
   std::cout << s_passed.d << endl ;
}

void f_print_special(sb & s_passed) {
   std::cout << s_passed.c << endl ;
}

template <class T>
void f_print(T & s_passed) {
   std::cout << s_passed.a << endl ;
   std::cout << s_passed.b << endl ;
   f_print_special(s_passed);
}
2 голосов
/ 02 ноября 2010

STH имеет правильный ответ.Однако, если вам нужно более общее решение, например, функция, принимающая sb-тип, может принимать любой тип, реализующий концепцию «имеет C» (или любой другой), тогда вам нужно использовать диспетчеризацию на основе тегов .Я бы посоветовал поискать его, потому что, хотя я мог бы описать одну гипотетическую ситуацию, которая может напоминать или не напоминать вашу реальную проблему, я не смог бы понять их все.

1 голос
/ 02 ноября 2010

Это не просто g ++.Это неверный C ++.Каждое утверждение в функции (шаблон или нет) должно быть допустимым, даже если вы можете «доказать», что оно не выполняется.

Что плохого в том, чтобы давать им отдельные функции?Конечно, вы можете работать с некоторыми общими частями, вызывая другую подфункцию.

Если вы хотите, чтобы функции имели одинаковое имя, продолжайте и сделайте это.Перегрузка функции справится с этим.

0 голосов
/ 02 ноября 2010

Возможно, это просто тестовый пример для вас при написании шаблонов, но более естественной реализацией было бы наследование sa и sb от общей базовой структуры sbase, скажем, с членами a и b только, а затем sa и sb реализуют свои собственные operator<<, делегируя базе operator<< для общих частей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...