要求类模板中的类型响应某个函数是否是一种好的做法
Is it good practice to require the type in a class template to respond to a certain func?
std-lib在类模板中有一些类型,这些类型需要该类型来覆盖某些OPERATOR,例如,我们在std::map中使用的类型要求该类型支持<操作人员
但要求某些功能好吗?考虑一下这个愚蠢的例子
template <typename T> struct Foo {
T t;
Foo() {
t.push_back(0);
}
};
int main() {
Foo<std::vector<int>> foo;
return 0;
}
在那里我创建了一个类模板Foo,它的类型需要有一个push_back成员func。这种设计对c++编码器来说是可接受的/通用的吗?
您所描述的被称为模板策略(请参阅本文),它是类或函数的一种完全合法且通用的设计模式。
当然。在描述类模板时,只需记录模板参数的要求。
请注意,在您的示例中,如果使用默认构造函数Foo<T>()
,T
实际上只需要push_back
函数。(就语言而言。为了安全起见,你的要求可能会更严格。)
如果您使用的是最新的编译器,还可以使用static_assert
来确保大多数模板参数要求得到遵守,和/或使不遵守要求时的错误消息更加清晰。
是的,很好。标准一直都是这样。作为一个示例,考虑std::back_inserter
,正如您的示例一样,它假定其模板类型实现了push_back
成员函数。虽然我们仍然没有概念,但您最好记录您的需求。它还有助于以有意义的方式命名模板类型;所以你可能有template <typename Container>
而不是template <typename T>
。
相关文章:
- 将错误返回给调用方而不是立即在 C++ 中抛出错误是否是一种好的做法
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 使用类在C++中存储和列出变量/方法是否是一种好的做法
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 从 std::string 到 std::array<char,size> 的 memcopy 额外数据是否是一种未定义的行为?
- 在类方法中使用 "this" 指针是否是一种好的做法?
- 派生类是单例是否是一种好的做法
- 即使在多任务处理时,添加用户时间 + 系统时间(来自 shell 的时间命令)是否是一种可靠的措施?
- 为许多类可能需要的所有常量变量制作独立的头文件是否是一种很好的做法?
- 移动 l 值参考参数是否是一种不好的做法?
- 返回对私有向量成员元素的非常量引用是否是一种不好的做法
- 禁止模板虚拟功能是否是一种不必要的谨慎
- 从 r 值引用限定方法返回 r 值引用是否是一种好的做法?
- C++ - 在类中包含不是类对象属性的变量是否是一种不好的做法
- 如果要调用多个成员函数,对象编辑器是否是一种好方法?
- 使用模板重载现有函数是否是一种不好的做法
- 在编译时检查模板参数是否是一种字符串
- 使用此"shortcutting function"是否是一种好的做法?
- 在无效函数中使用退出来纠正错误是否是一种好的做法
- 在声明中省略参数名称是否是一种好的做法