【问题标题】:How to write a template function where its parameter type is required to be inheriting certain class [duplicate]如何编写模板函数,其参数类型需要继承某个类[重复]
【发布时间】:2013-06-19 15:57:36
【问题描述】:

是否可以声明某个类型派生自 B 的模板函数?

我的目标是实现这样的目标:

template<class T : std::ostream> void write(T os) {
    os << "...";
} 

template<class T : std::string> void write(T s) {
   // ...
}

编辑:我知道这不是一个可靠的示例,因为从字符串派生并不常见,但请注意,这只是一个示例。

所以欢迎任何解决方案,如解决方法,但是我希望能够显式实例化模板函数。

【问题讨论】:

  • 您不需要模板。如果通过引用基类来获取参数,则可以传递从它派生的任何内容。
  • @jrok 我认为重点是他想使用模板
  • @jrok 我的目标是速度。 ;)
  • 模板不应比常规内联函数快。如果您会产生副本,则通过引用传递会更快。我认为没有理由使用模板,除非您需要访问 T 的非继承成员。

标签: c++ templates inheritance return


【解决方案1】:

是的,使用C++11&lt;type_traits&gt;可以实现。
如果你只有 C++03,可以改用 Boost 的&lt;type_traits&gt;

template <typename T>
typename std::enable_if<std::is_base_of<std::ostream, T>::value>::type
write(T& os) {
}

【讨论】:

  • 非常感谢,正是我要找的地方!
  • 好答案.. 太快了。
  • 您确定您的编辑正确吗?语法我不熟悉。
  • 是的,编辑是正确的。接得好。 @Tim,谷歌“依赖类型名”。
  • @Tim typename std::enable_if&lt;...&gt;::type是函数的返回类型,如果&lt;...&gt;为真则为空,否则为替换失败。
【解决方案2】:

任何派生自 std::ostream 的对象都可以用作参数

void write(std::ostream os) {
    os << "...";
} 

【讨论】:

    猜你喜欢
    • 2013-03-25
    • 2019-09-02
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多