#include <iostream>
#include <vector>

struct item
{
    int numItems = 0;
    float price = 0;
    double foo = 0;

    item(int num, float pr, double f)
    {
        numItems = num;
        price = pr;
        foo = f;
    }
};

template <class T>
void printValues(item* vecItemPtr, T* targetElemPtr, int numItems)
{
    ptrdiff_t targetElementOffset = reinterpret_cast<char*>(targetElemPtr) - reinterpret_cast<char*>(vecItemPtr);

    for (int i = 0; i < numItems; i++)
    {
        std::cout << *reinterpret_cast<T*>(reinterpret_cast<char*>(vecItemPtr + i) + targetElementOffset) << std::endl;
    }
}

int main()
{
    std::vector<item> test;

    item item1(10, 3.0f, 8);
    item item2(20, 1.0f, 4);

    test.reserve(2);
    test.push_back(item1);
    test.push_back(item2);

    // Say I want to print numItems, 
    printValues(&test[0], &test[0].numItems, test.size());

    // Say I want to print price
    printValues(&test[0], &test[0].price, test.size());

    // Say I want to print foo
    printValues(&test[0], &test[0].foo, test.size());
}