1

std lib 在类模板中有类型,这些类型需要覆盖某些 OPERATORS 的类型,例如,我们在 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 成员函数。这种设计对于 c++ 编码人员来说是否可以接受/通用?

4

3 回答 3

2

您所描述的称为模板策略(请参阅this),它是类或函数的完全合法且通用的设计模式。

于 2013-02-12T17:51:01.457 回答
2

当然。在描述类模板时只需记录对模板参数的要求。

请注意,在您的示例中,如果使用默认构造函数,T实际上只需要一个函数。(就语言而言。为了安全起见,您的要求可能会更严格。)push_backFoo<T>()

如果您使用的是最新的编译器,您还可以使用static_assert它来确保遵守大多数模板参数要求,和/或在不遵守要求时使错误消息更加清晰。

于 2013-02-12T17:53:51.400 回答
1

是的,没关系。标准一直在这样做。作为一个例子,考虑std::back_inserter哪个,就像你的例子一样,假定它的模板类型实现了一个push_back成员函数。虽然我们仍然没有概念,但您最好记录您的要求。它还有助于以有意义的方式命名您的模板类型;所以,而不是template <typename T>,你可能有template <typename Container>

于 2013-02-12T17:50:20.213 回答