2016-04-01 60 views
1

使用模板类我有类是这样的:没有模板

template<size_t MAX_SIZE> 
struct Buffer{ 
    size_t size; 
    char data[MAX_SIZE]; // this must be inside the struct itself 
    constexpr static size_t max_size = MAX_SIZE; 
}; 

我需要能够通过这个类的功能是不应该使用的模板,目前我在做这样的事情:

void process(size_t &size, char *data, size_t max_size); 

int main(){ 
    Buffer<1024> b; 
    process(b.size, b.data, b.max_size); 
} 

有没有更好的方法来做同样的事情?我可以考虑基类,并通过引用传递,但它太复杂,无法正确。

(这是不实际的代码,请如果有语法错误,不讲究。)

+2

你可能想避免这个问题,但是:为什么过程不允许使用模板?它允许使用什么,为什么? – IceFire

+0

很好的问题。理由对我来说不是100%明确的 - 直觉。冥想我会。认真 - 我想要process()的代码在不同的.o文件中 – Nick

+0

你的直觉可能是你不想让进程成为模板。这需要更深入的思考:将MAX_SIZE作为模板参数意味着它定义了类型。因此,流程必须成为处理多种不同类型的模板。如果Buffer实际上只是一种类型,那么MAX_SIZE不应该是模板参数。 – IceFire

回答

5

我会用一个包装法...

template<size_t MAX_SIZE> 
void process(Buffer<MAX_SIZE>& buffer) 
{ 
    process(buffer.size, buffer.data, buffer.max_size); 
} 

...然后就调用...

int main() 
{ 
    Buffer<1024> buffy; 
    process(buffy); 
    return 0; 
} 
5

我不明白为什么需要调用函数来避免使用模板。这似乎是一个任意的不必要的限制。

只需提供辅助函数和模板类型的转换即可。

struct Helper 
{ 
    size_t size; 
    size_t max_size; 
    char *data; 
}; 

template<size_t MAX_SIZE> 
struct Buffer 
{ 
    size_t size; 
    char data[MAX_SIZE]; // this must be inside the struct itself 

    constexpr static size_t max_size = MAX_SIZE; 

    operator struct Helper() {return Helper {size, max_size, &data[0]};}; // C++11 
    //  operator struct Helper() {Helper temp(size, max_size, &data[0]); return temp;}; // pre C++11 

}; 

void process(struct Helper); 

int main() 
{ 
    Buffer<1024> b; 
    process(b); // or process(Helper(b)) 
} 

只要你避开C++特定功能,该Helper型也能够被传递给C.

0

如果你的理由不使用模板的是,你不希望有非Buffer小号传递给函数然后让我告诉你,这不是一个问题。您可以使用模板参数只是大小有如

template<size_t MAX_SIZE> 
void process(Buffer<MAX_SIZE>& buffer) 
{ 
    //do stuff here 
} 

现在你只能通过一个Bufferprocess。您可以通过任何尺寸Buffer但它只会采取Buffer s。

Live Example

1

有关使用类型定义是什么。我的意思是,您可以使用下一个签名功能:void process(const Buffer<1024>& b);,但由于模板参数声明,它不太适合。如果您将价值改变为别的东西,您也必须更改签名。为了避免这种情况,请尝试使用typedef。像这样的东西

typedef Buffer<1024> TBuffer; 

void process(const TBuffer& buffer); 

int main(){ 
    TBuffer b; 
    process(b); 
} 

如果在这种情况下更改模板值,则不需要更改其余代码。