簡體   English   中英

為模板專門化添加更多類型

[英]Adding more types to template specialization

我有一個簡單的模板化類,我為使用它的每種類型實例化,如下所示:

template<class T> struct meta {
  static const std::string& get_name() {return T::class_name;}
};

template<> struct meta<double> {
  static constexpr const char* class_name = "double";
  static const char* get_name() { return class_name; }
};

template<> struct meta<std::vector<double> {
  static constexpr const char* class_name = "std::vector<double>";
  static const char* get_name() { return class_name; }
};

template<> struct meta<std::array<double,2>> {
  static constexpr const char* class_name = "double[]";
  static const char* get_name() { return class_name; }
};

然后,我可以像這樣使用它們:

int main() {
  std::cout << meta<double>::get_name() << '\n';
  std::cout << meta<std::vector<double> >::get_name() << '\n';
  std::cout << meta<std::array<double,2> >::get_name() << '\n';
}

我使用宏為每種基本類型生成模板專業化的變體,但由於它包含一個基本類型一個整數,因此我被困在std::array 我想了解如何將新的模板化參數添加到已經模板化的專業化中,這樣我就不需要對每個可能的整數值進行專業化。

我試過了:

template<int I> struct meta<std::array<double,I>> {
    static constexpr const char* class_name = "double[]";
    static const char* get_name() { return class_name; }
};

錯誤:“ class_name”不是“ std :: array”的成員

std::array C ++ 文檔中

template< 
    class T, 
    std::size_t N 
> struct array;

所以,你需要

template<std::size_t I> struct meta<std::array<double, I>> {
    static constexpr const char* class_name = "double[]";
    static const char* get_name() { return class_name; }
};

因為intstd::size_t是兩種不同的類型(具有不同的符號性),所以部分模板專業化將不匹配。 int更改為size_t


總結:請閱讀文檔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM