【问题标题】:specification of function templates功能模板规范
【发布时间】:2011-12-04 19:07:45
【问题描述】:

我想创建一个函数模板,其中类 T 仅限于特殊基类 T_base 的派生类。实现这一目标的有效方法是什么?感谢您的帮助!

【问题讨论】:

    标签: c++ templates derived-class base-class function-templates


    【解决方案1】:

    您可以使用类型特征和 SFINAE

    template<typename T, 
             bool[std::is_base_of<T_base, T>::value] = nullptr>
    void f(T const&);
    

    C++03 版本也适用于 C++11

    template<typename T>
    typename boost::enable_if< boost::is_base_of<T_base, T> >::type 
    f(T const&);
    

    有 C++11 版本将 enable_if 移动到模板参数列表中,使用默认参数

    template<typename T, 
             typename = typename std::enable_if<
               std::is_base_of<T_base, T>::value>::type>
    void f(T const&);
    

    遗憾的是,如果您的其他重载的唯一区别是 SFINAE 字符串(即默认参数),那么您不能重载 f,因为默认参数不是函数模板签名的一部分。但是模板参数本身的类型是(这些规则就像普通函数参数一样)。

    【讨论】:

    • 请注意,这些是 C++11 特性
    【解决方案2】:

    C++0x 有std::enable_if;如果你的编译器还不支持,boost::enable_if

    例如,如果签名是template&lt;typename T&gt; int f(T&amp;),你会使用

    template<typename T>
      std::enable_if<std::is_base_of<T_base, T>::value, int>::type f(T&);
    

    【讨论】:

      【解决方案3】:

      我能想到的最简单的方法是这样的:

      template<class T>
      void someFunc(T arg)
      {
          dynamic_cast<BaseClass>(arg); // will throw an exception if not castable to base class
          // continue...
      }
      

      【讨论】:

      • Johannes 的解决方案更好 ;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 2018-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多