C++ 在通用编程/TMP世界中,模型/a策略和“a”究竟是什么;概念;?
我想在一个地方知道这三个概念的精确而简洁的定义。答案的质量取决于以下两点C++ 在通用编程/TMP世界中,模型/a策略和“a”究竟是什么;概念;?,c++,templates,components,metaprogramming,generic-programming,C++,Templates,Components,Metaprogramming,Generic Programming,我想在一个地方知道这三个概念的精确而简洁的定义。答案的质量取决于以下两点 显示一个简单的代码片段,以显示如何以及如何使用该概念/技术 要简单易懂,这样一个没有接触过这个领域的程序员就可以掌握它 注意: 可能有许多正确的答案,因为每个概念都有许多不同的方面。如果有很多好的答案,我最终会把这个问题转化为CW并汇总答案 --后接受编辑-- Boost对泛型编程概念有很好的理解概念是一组需求,类型必须满足这些需求才能对概念进行建模 例如,如果对于类型为T的一对对象a和b,表达式a
Boost对泛型编程概念有很好的理解概念是一组需求,类型必须满足这些需求才能对概念进行建模 例如,如果对于类型为
T
的一对对象a
和b
,表达式a
格式良好,可转换为bool
,并产生严格的弱序关系,则类型T
的可比性。类型int
是lessthanCompariable
模型的一个示例
概念可以形成细化层次结构。如果A
的要求是B
要求的超集,则概念A
是概念B
的细化。例如,是对的细化
概念用于限制模板可以专用的类型集。例如,std::sort
算法可以接受一对对象,只要它们建模
std::向量向量向量机;
std::列表;
//好的,std::vector::iterator是“RandomAccessIterator”的一个模型。
排序(vec.begin(),vec.end());
//错误,std::list::iterator只是'BidirectionalIterator'的一个模型。
排序(list.begin(),list.end());
<>注意,概念是C++标准和各种其他文档中使用的非正式对象。该语言不直接支持概念()。A.o.SGI文档中提到的“模型”指的是C++0x提案中引入的“概念”:它是编译时,相当于OO建模中的“接口”。它总结了通用代码对模板参数的要求
例如,您可以说std::transform
函数的outputierator
参数应该实现operator++()
和operator=(T)
,以便函数工作
策略是另一回事:它使算法可以从外部改变。一个很好的例子是stl容器中使用较少的分配器
参数:它告诉算法如何分配内存。如果愿意,可以制作一个std::vector
,其中整个vector
函数将在云中而不是堆中分配内存。(注意,我不太适合实现这个分配器)。概念是一个类型上的一组需求。例如,您可以有一个名为“RandomAccessible”的概念,它将需求放在一个类型上,该类型在O(1)时间内实现操作符[](int)
由于概念从现有的C++标准中删除,它们只作为C++文档存在于C++中。例如,你可以阅读
当一个类型满足一个概念的所有要求时,您称它为该概念的模型。例如,std::vector
是容器概念的一个模型(或者,等效地,std::vector
“模型”容器)
最后,策略是一个行为单元,它可以与其他行为单元结合起来构建复杂的类。例如,假设您想要构建两个类:一个固定大小的数组和一个动态调整大小的数组。这两个类都有很多共享功能,但只是它们的存储机制和一些功能有所不同(例如,在固定大小的数组上不能调用push_back
)
模板
类数组:公共存储策略
{
公众:
T&运算符[](int i){返回数据[i];}
};
模板
类固定存储
{
T数据[N];
};
模板
类动态存储
{
T*数据;
公众:
无效推回(常数T和值)
{
//动态数组插入代码
}
};
用法如下:
int main()
{
array<int, fixed_storage<int, 10> > fixed_array;
array<int, dynamic_storage<int> > dynamic_array;
dynamic_array.push_back(1);
fixed_array[9] = dynamic_array[0];
}
intmain()
{
固定阵列;
动态数组;
动态_数组。向后推_(1);
固定数组[9]=动态数组[0];
}
显然,这是一个非常粗糙和不完整的例子,但我希望它能阐明政策背后的概念
注意,在示例中,我们可以说固定存储
和动态存储
是存储策略
概念的“模型”。当然,我们需要正式定义StoragePolicy
概念对其模型的要求。在这种情况下,只需定义一个可索引的data
成员变量即可
template <class T, class StoragePolicy>
class array : public StoragePolicy
{
public:
T& operator[](int i) { return data[i]; }
};
template <class T, int N>
class fixed_storage
{
T data[N];
};
template <class T>
class dynamic_storage
{
T* data;
public:
void push_back(const T& value)
{
// Code for dynamic array insertion
}
};
int main()
{
array<int, fixed_storage<int, 10> > fixed_array;
array<int, dynamic_storage<int> > dynamic_array;
dynamic_array.push_back(1);
fixed_array[9] = dynamic_array[0];
}