Хорошо, заголовок вопроса немного сложно сформулировать. Я пытаюсь создать класс шаблона с функциями get/set, которые могут обрабатывать простые типы и структуры.Доступ к элементам типа структуры класса шаблонов
Это просто для типов, таких как целые числа и char, и т. Д. Но когда тип шаблона «Т» является структурой, становится все труднее.
Например, здесь есть шаблонный класс, где я опустил различные части его (например, как конструктор, и т.д.), но он показывает получить/установить функцию:
EDIT: только этот класс разрешено изменять данные, поэтому передача ссылки снаружи не допускается. Причина в том, что я хочу сделать мьютекс вокруг набора/get. Я/есть обновление функции ...
template <class T> class storage
{
private:
T m_var;
pthread_mutex_t m_mutex;
public:
void set(T value)
{
pthread_mutex_lock(&m_mutex);
m_var = value;
pthread_mutex_unlock(&m_mutex);
}
T get(void)
{
T tmp;
// Note: Can't return the value within the mutex otherwise we could get into a deadlock. So
// we have to first read the value into a temporary variable and then return that.
pthread_mutex_lock(&m_mutex);
tmp = m_var;
pthread_mutex_unlock(&m_mutex);
return tmp;
}
};
Затем рассмотрим следующий код:
struct shape_t
{
int numSides;
int x;
int y;
}
int main()
{
storage<int> intStore;
storage<shape_t> shapeStore;
// To set int value I can do:
intStore.set(2);
// To set shape_t value I can do:
shape_t tempShape;
tempShape.numSides = 2;
tempShape.x = 5;
tempShape.y = 4;
shapeStore.set(tempShape);
// To modify 'x' (and keep y and numSides the same) I have to do:
shape_t tempShape = shapeStore.get();
tempShape.x = 5;
shapeStore.set(tempShape);
}
То, что я хочу быть в состоянии сделать, если его возможно, это установить членов shape_t индивидуально с помощью некоторых средств в классе шаблонов, например:
shapeStore.set(T::numSides, 2);
shapeStore.set(T::x, 5);
shapeStore.set(T::y, 4);
И не нужно использовать temp var. Это возможно? как?
I looked at this answer, но это не совсем то, что я хотел, потому что это для конкретного типа структуры
Это может быть сделано с помощью макросов. Вам нужен пример? – teivaz