Шаблонная функция C++, которая использует поле, существующее только в некоторых типах данных?

Эти уведомления вызваны тем, что у вас нет используемой переменной defined, а ключ my_index не присутствовал в переменной $my_array.

Эти уведомления появлялись каждый раз, потому что ваш code неверен, но, вероятно, у вас не было сообщений об уведомлениях.

Решить ошибки:

$my_variable_name = "Variable name"; // defining variable
echo "My variable value is: " . $my_variable_name;

if(isset($my_array["my_index"])){
    echo "My index value is: " . $my_array["my_index"]; // check if my_index is set 
}

Еще один способ получить это:

ini_set("error_reporting", false)
5
задан OJW 17 July 2009 в 11:14
поделиться

4 ответа

Для уточнения предлагаемого использования специализации шаблонов:

template <class T> void myfunc(T data)
{  
    printf("%d", VRI_data.a);  
}

// specialization for MyClassWithB:
template <>
void myfunc<MyClassWithB>(MyClassWithB data)
{
    printf("%d", data.a);  
    printf("%d", data.b); 
}

Однако, это требует специализации для каждого класса, нет "автоматического обнаружения" "из б. Кроме того, вы повторяете много кода.

Вы можете выделить этот аспект "имеющий b" во вспомогательный шаблон. Простая демонстрация:

// helper template - "normal" classes don't have a b
template  <typename T>
int * GetB(T data) { return NULL; }  

// specialization - MyClassWithB does have a b:
template<>
int * GetB<MyClassWithB>(MyClassWithB data) { return &data.b; }

// generic print template
template <class T> void myfunc(T data)
{  
    printf("%d", VRI_data.a);  
    int * pb = GetB(data);
    if (pb)
      printf("%d", *pb); 
}
5
ответ дан 14 December 2019 в 04:45
поделиться

Решение 1. Вы можете использовать специализацию шаблона . Специализация может выполняться на основе класса или какой-либо более общей черты.

3
ответ дан 14 December 2019 в 04:45
поделиться

Если вы не хотите жестко кодировать специализацию S1 и S2 в коде, вы можете сделать:

typedef struct
{
  int a;
  int b;
}s1;

typedef struct
{
  int a;
}s2;

template <class T, bool contains_b> 
struct MyFunc
{

    void operator()(T data)
    {
        printf("%d", data.a);
    }

};


template <class T> 
struct MyFunc<T, true>
{
    void operator()(T data)
    {
        printf("%d", data.a);
        printf("%d", data.b); 

    }
};

template<class T, bool contains_b>
void myFunc(T t)
{
    MyFunc<T, contains_b> m;
    m(t);
}

int _tmain(int argc, _TCHAR* argv[])
{
 s1 data1;
  data1.a = 1;
  data1.b = 2;

  myFunc<s1,true>(data1) ;

  s2 data2;
  data2.a = 1;
  myFunc<s2,false>(data2);
  return 0;
}
0
ответ дан 14 December 2019 в 04:45
поделиться

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

Обновленный код:

typedef struct
{
  int a;
  int b;
}s1;

typedef struct
{
  int a;
}s2;

template <class VTI_type> void extraStuff(VTI_type VRI_data)
{
}

template <> void extraStuff<s1>(s1 VRI_data)
{
  printf(" and b = %d\n", VRI_data.b);
}

template <class VTI_type> void myfunc(VTI_type VRI_data)
{
  printf("a = %d\n", VRI_data.a);
  extraStuff(VRI_data);
}

void main()
{
  s1 data1;
  data1.a = 1;
  data1.b = 2;
  myfunc <s1> (data1);

  s2 data2;
  data2.a = 1;
  myfunc <s2> (data2);
}
0
ответ дан 14 December 2019 в 04:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: