我的问题我想适用于您通过通用指针或转换访问结构的任何情况。
我有一个模板结构:
template <typename T>
struct Buffer
{
T buffer; // <-- These will be various different structs of different data types
// Perhaps some other members
};
一旦我实例化了其中一个struct对象,我就想把它传递给一个函数。我知道可能正确的方法是使函数像:
void myFunc(Buffer<T>& buffer);
我的理解是,每次在我的代码中我发送另一个缓冲区对象时,模板必须实例化该函数的另一个版本,因为每个版本的内部数据都不同。我想另一种方法是通过虚函数使其通用,但我想知道,如果我要制作通用函数:
void myFunc(Buffer<int>& buffer);
假设我对其成员的对齐和位置小心,我可以去:
void myFunc(Buffer<int>& buffer)
{
// My buffer is the first member, the type is unknown but its size is known
T or int buffer; // <--- and send this object off somewhere (sending its address?)
}
我可以通过其他方式轻松地做到这一点,但这让我大吃一惊,我想知道它是否安全。可能在任何情况下都不可取。感谢。
答案 0 :(得分:1)
&#34;我的理解是,每次在我的代码中我发送另一个缓冲对象时,模板必须实例化该函数的另一个版本&#34;
&#34;看到我好像不知道我会做多少个物品&#34;
我想也许您期望发送给该函数的每个实例的成本 - 或者每次调用该函数时。暂时忽略内联,请注意您发送给该函数的每个类型只需要一个成本。如果您的应用在代码中的5个不同位置发送100 Buffer<int>
个,在1个位置发送200个Buffer<char>
,在30个位置发送30个Buffer<std::string>
,则只有3个实例。功能
阅读第一条评论后编辑:
如果你的功能是将这些结构传递给显卡(或API等),那么&#34;业务很可能会结束&#34;你的代码真的只是想在某处传递struct的地址和大小。如果它像这样简单(psuedo-ish code)
template <typename Buffer>
void myFunc(Buffer& buffer) {
send_to_gfx(&buffer, sizeof(buffer));
}
然后,实例化成千上万的这些并不重要。他们都将被内联到直接拨打send_to_gfx
。 (当然,这假设send_to_gfx
期望第一个参数的void*
指针。)