2013-06-24 2 views
0

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

#include <iostream> 

using namespace std; 

#define FUNC(T1, T2) do {cout<< T1.T2<<endl; } while(0); 

struct ST{ 
    double t1; 
    int t2; 
    double t3; 
}; 

struct ST2{ 
    int t1; 
    double h2; 
}; 


int main() 
{ 
    ST st; 
    ST2 st2; 
    st.t1 = 1.1; 
    st.t2 = 0; 
    st.t3 = 3.3; 
    FUNC(st, t1); 
    FUNC(st, t2); 
    FUNC(st, t3); 
    FUNC(st2, h2); 
} 
+0

Зачем использовать макросы? –

ответ

3

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

template <typename T, typename Q> 
void print(T& var, Q T::* mem) 
{ 
    cout << var.*mem << endl; 
} 

Использование:

print(st, &ST::t1); 
print(st, &ST::t2); 
print(st2, &ST2::h2); 

Обратите внимание, что st2.h2 не инициализируется в вашем примере, так что ваш код имеет неопределенное поведение.

+0

Мое первоначальное намерение состоит в том, чтобы получить адрес и тип конкретной переменной-члена, чтобы я мог создать другой класс для наблюдения и обновления переменной (но не всего класса). –

+0

. Ну, как-то вроде указателя-указателя. Вы можете сохранить этот указатель и форму ссылки на экземпляр в классе. Я не совсем понимаю, что вы пытаетесь сделать, поэтому трудно быть более конкретным. – Mat

+0

Спасибо вам за ответ. Я думаю, что я согласен с ответом. Я хотел бы свести свой вопрос к самому простому, когда я разместил его. Но это также легко вводит людей в заблуждение. –

4

Короткий ответ: Нет. Но зачем вы хотите? Что такого особенного в этом ( переменная класса , участник ) обозначение? Вы, очевидно, можете написать функцию, которая принимает st.t1 вместо st, t1 - почему вы пытаетесь избежать этого?

Длинный ответ: Не полезно. t1 не входит в область, в которую вы звоните FUNC(st, t1) ... текущий макрос заменяет его st.t1, который можно найти в текущей области. Если вы действительно действительно desparately хотел взломать что-то, вы должны были бы поставить какой-то из t1, t2, t3, h2 и т.д. объектов в области, которые могут быть переданы функции и каким-то образом закодированы, какое поле должно быть доступно. Наличие локальных t1 и других ссылок на переменные-члены является очевидным выбором. Это было бы довольно неудобно, многословно и подвержено ошибкам, хотя: настройка всех этих дополнительных переменных только для поддержки этой косвенности.

+0

Извините. Мой пример может быть упрощен. Мое первоначальное намерение состоит в том, чтобы получить адрес и тип определенной переменной-члена, чтобы я мог создать другой класс для наблюдения и обновления переменной (но не всего класса). –

+1

Тогда вид техники, показанной Матом, должен помочь вам: внутренне он может хранить подходящих функторов или создать подходящий экземпляр шаблона конкретного типа, который вы можете отправить полиморфно из вашего кода наблюдения/обновления .... –

+0

Спасибо за вашу помощь. Я только пытаюсь упростить свой вопрос, но я не сделал этого ясно. –