2016-10-23 2 views
-2

С C++ и C мы можем передавать разные функции другой функции с помощью указателя на void construct. Я хотел бы сделать то же самое, переходя к структур функции, как этот простой пример:Как передать указатели на разные структуры для функции?

#include <iostream> 
using namespace std; 

struct S1 { 
    static constexpr int n=1; 
    static constexpr double v=1.2; 
}; 
struct S2 { 
    static constexpr int n=2; 
    static constexpr double v=3.4; 
}; 

typedef void *Vp; // this would be (*Vp)() for functions 

void func(Vp p) { 
    cout << "n=" << p->n << " v=" <<'\n' 
    // (fails here with error: 'Vp {aka void*}' is not 
    // a pointer-to-object type) 
} 
int main() { 
    struct S1 s1; 
    struct S2 s2; 
    cout <<"main: using first data\n"; 
    func(&s1); 
    cout <<"main: using second data\n"; 
    func(&s2); 
    return 0; 
} 

Кто-нибудь знает, как сделать эту работу или, если это вообще возможно?
Аналогичный вопрос был задан раньше, но ответы мне не помогли: passing different structs to a function(using void *)
Я знаю, что было бы лучше использовать одну структуру и создать разные экземпляры, но у меня уже есть заголовок с большим количеством данных, загружаемых в структуры сюда.

+0

Какая у вас структура? Использование указателей void обычно является хорошим признаком очень плохого дизайна. PS. 'p-> n' не имеет никакого смысла –

+2

' void * 'теряет всю информацию. Чего ты ожидал?? –

ответ

1

Вы не можете сделать это, не имея двух отдельных функций, но вы можете использовать компилятор для их генерации, а может. Вы можете использовать шаблон функцию:

template<typename StructType> 
void func(StructType *p) { 
    cout << "n=" << p->n << " v=" << p->v << endl; 
} 

Теперь, когда вы пишете func(&s1);, компилятор будет генерировать новую функцию для вас, на основе шаблона, называется func<S1>, который выглядит следующим образом:

void func<S1>(S1 *p) { // not real syntax 
    cout << "n=" << p->n << " v=" << p->v << endl; 
} 

и аналогичным образом для S2.

+0

immibis, спасибо. Идея вашего шаблона функций отлично работает. –

Смежные вопросы