2016-11-24 89 views
-2

我的问题我猜是适用于任何你通过通用指针或转换访问结构的情况。我可以假装我将一个不同类型的对象传递给一个函数吗?

我有一个模板结构:

template <typename T> 
struct Buffer 
{ 
    T buffer;   // <-- These will be various different structs of different data types 
    // Perhaps some other members 
}; 

一旦我被实例化,我想将它传递给一个函数,这些结构对象之一。我大概知道正确的方法是,使的功能等:

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

} 

我可以很容易地做到这一点,但这一切都在我脑海中,我想知道它是否安全。在任何情况下可能都不可取。谢谢。

+6

我不明白这个问题。 –

+0

您是否试图限制/避免某些类型的实例化? – P0W

+0

@Marco。 A.哈哈哈,好的。我完全得到你。 – Zebrafish

回答

1

“我的理解是,在我的代码,每次我给另一个缓冲区对象的模板有实例此功能的另一个版本”

“看,好像我不知道我会多少对象做“

我想也许你正期待着你发送给函数的每个实例的成本 - 或者每次你调用该函数。现在忽略内联,请注意,发送给该函数的每个类型的只有一个成本。如果您的应用在代码中的5个不同位置发送100 Buffer<int> s,并且在30个位置发送200 Buffer<char> s和30 Buffer<std::string> s - 函数只有3个实例。阅读1评论后


编辑:

如果您运行的情况下通过这些结构的图形卡(或API等),它很可能是你的代码的“业务结束”真的只是想在某处传递结构体的地址和大小。如果它像这样简单(伪代码)

template <typename Buffer> 
void myFunc(Buffer& buffer) { 
    send_to_gfx(&buffer, sizeof(buffer)); 
} 

然后,它有多少千万您实例化并不重要。他们将全部内联,直接致电send_to_gfx。 (当然,这个假设send_to_gfx预计会有一个void*指针作为它的第一个参数。)

+0

感谢您的回答。实际上,角度括号之间的位将是结构体,例如由{vec4,float,int}组成,并且它们都将不同,以发送到图形卡。 – Zebrafish

+0

@TitoneMaurice - 图形卡(或API)只有几十种类型。即使您以这种方式也将参数传递给自定义着色器,您可能只有少数着色器。类型的总数('struct {vec4,float,int}'是1类型)你可能小到不用担心。 –

+0

是的。我刚刚进入OpenGL,我真的不知道该怎么做。对于一个人来说,这确实太过分了,我通常会花一整天的时间努力寻找一件事的答案,以便取得进步。我需要去学校。 – Zebrafish

相关问题