c++模板专门化



我有一个模板函数,它没有参数

template<typename T>
T cast() {
return T();
}

我想把它专门化为一些模板类,比如vector,比如

template<typename T>
template<>
vector<T> cast<vector<T>>() {
// something special
return vector<T>()
}

,因为它不带实参,所以不能重载。我应该怎么做才能实现它?

函数不能部分特化。

你可能

  • 提供另一个自定义点

    • 类,可以部分特化:

      template <typename T>
      struct impl
      {
      T operator()() const { return T(); }
      };
      template <typename T>
      struct impl<std::vector<T>>
      {
      std::vector<T> operator()() const { /*Something special*/ return std::vector<T>(); }
      };
      template<typename T>
      T cast() {
      return impl<T>{}();
      }    
      
    • 期待与"超载功能;tag":

      template <typename T>
      T impl(std::struct_identity<T>)
      {
      return T();
      };
      template <typename T>
      std::vector<T> impl(std::struct_identity<std::vector<T>>)
      {
      /*Something special*/
      return std::vector<T>();
      };
      template<typename T>
      T cast() {
      return impl(std::struct_identity<T>{});
      }    
      
  • 创建不同的(独占的)重载(从开始):

    // traits to detect std::vector
    template <typename T>
    struct is_vector : std::false_type {};
    template <typename T, typename A>
    struct is_vector<std::vector<T, A>> : std::true_type {};
    template<typename T, std::enale_if_t<!is_vector<T>::value, int> = 0>
    T cast() {
    return T();
    }
    template<typename T, std::enale_if_t<is_vector<T>::value, int> = 0>
    T cast() {
    /*Something special*/
    return T();
    }
    
  • 或自c++ 17起,使用if constexpr:

    // traits to detect std::vector
    template <typename T>
    struct is_vector : std::false_type {};
    template <typename T, typename A>
    struct is_vector<std::vector<T, A>> : std::true_type {};
    template<typename T>
    T cast() {
    if constexpr(is_vector<T>::value) {
    /*Something special*/
    return T();
    } else {
    return T();
    }
    }
    
  • 或c++ 20日以来,你可能过载约束:

    // traits to detect std::vector
    template <typename T>
    struct is_vector : std::false_type {};
    template <typename T, typename A>
    struct is_vector<std::vector<T, A>> : std::true_type {};
    template<typename T>
    T cast() {
    return T();
    }
    template<typename T>
    requires(is_vector<T>)
    T cast() {
    /*Something special*/
    return T();
    }
    

相关内容

  • 没有找到相关文章

最新更新