我只是在需要时将这种语法用于参数:
示例构造函数声明:
t_array(const t_ownership_policy::t_take& policy, THESpecialType* const arg);
在呼叫站点使用:
t_array array(t_ownership_policy::Take, THESpecialTypeCreate(...));
Wheret_ownership_policy::t_take
只是一个虚拟的重载消歧器类型名。
在这个系统中,有多个策略,每个策略都有不同的类型。我倾向于每个策略的唯一类型,因为类型化枚举(例如)不支持初始化,并且将不受支持的策略传递给函数或构造函数太容易了。“多态”策略可以减少符号数,但这很痛苦,因为它将错误检测推到了运行时。
对于“返回”:
void func(t_container<t_type>& outValue);
t_container
您选择的指针容器类型在哪里。然后容器类型已经实现了必要的样板。该容器可能类似于shared_ptr
,或您编写的某些专业化。
对于更复杂的类型,我会经常使用如下语法:
void func(t_special_container& outValue) {
...
outValue.take(ptr);
- or -
outValue.copy(ptr);