我可以假装我将不同类型的对象传递给函数吗?

时间:2016-11-24 08:24:01

标签: c++ templates static alignment size

我的问题我想适用于您通过通用指针或转换访问结构的任何情况。

我有一个模板结构:

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?)

}

我可以通过其他方式轻松地做到这一点,但这让我大吃一惊,我想知道它是否安全。可能在任何情况下都不可取。感谢。

1 个答案:

答案 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*指针。)