考虑以下代码:
template<typename T, size_t S> struct MyArray {
int length;
T contents_[S];
MyArray() { length = S; }
T& operator[](const int index) {
assert(index >= 0 && index < length);
return contents_[index];
}
int Length() { return length; }
};
从根本上讲,没有理由为S的每个值创建Length函数和下标运算符的单独副本。但我担心,事实上,对于S的每个不同值,这些函数都会重复,这限制了这种方法的实用性。
(如果你好奇我为什么不使用std::vector,那是因为这是一个没有任何基于堆的内存分配的嵌入式应用程序(
MSVC使用"相同comdat折叠";(ICF(。这需要具有相同实现的任意两个方法(或函数(。。。并且对它们使用相同的功能。
gcc的金连接子(显然还有clang(也可以做到这一点(具有不同程度的攻击性(。
除此之外,您还必须手动操作。
struct baseArray{
int length=0;
int Length() const { return length; }
};
template<class T>
struct buffBaseArray:baseArray{
T& operator[](const int index) {
assert(index >= 0 && index < this->length);
return reinterpret_cast<T*>(this+1)[index];// todo// alignment and ub
}
};
template<typename T, size_t S>
struct MyArray:buffBaseArray<T> {
T contents_[S];
MyArray() { length = S; }
};
或者一些不那么UB的东西。