要求类模板中的类型响应某个函数是否是一种好的做法

Is it good practice to require the type in a class template to respond to a certain func?

本文关键字:是否是 一种 函数 响应 类型      更新时间:2023-10-16

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>

相关文章: