簡體   English   中英

專門化靜態constexpr數據成員

[英]Specialize static constexpr data member

我有一個類來描述某種類型的特征。

template<typename T>
struct my_traits
{
    static constexpr int some_trait = 0;

    static constexpr T min() { return std::numeric_limtis<T>::min(); }
    static constexpr T max() { return std::numeric_limits<T>::max(); }
};

我想專門化my_traits::some_trait但是當我嘗試時:

template<> constexpr int my_traits<int>::some_trait = 1;

編譯器抱怨my_traits::some_trait已經有一個初始化器。 當然,我可以通過以下方式專門化它:

template<>
struct my_traits<int>
{
    static constexpr int some_trait = 1;

    // min and max
};

但是我必須重新定義所有其他功能,即使它們完全相同。

那么如何在不重復minmax情況下專門化my_traits<int>::some_trait呢?

有幾種方法可以做到這一點。 @Piotr Skotnicki和@Niall提到通過一些可以專門化的助手進行初始化。 通常,只需重新構建代碼,以便您可以專門化某些類或函數,然后使用(通過組合或繼承)特殊部分,而不需要專門化的部分。

作為評論替代方案的一個例子,這里有一個專門的基礎:

#include <iostream>                                                                                                                                                                                          
#include <limits>

template<typename T>
struct my_specializing_traits
{   
    static constexpr int some_trait = 0;
};  

template<>
struct my_specializing_traits<int>
{   
    static constexpr int some_trait = 1;
};  

現在你可以將它子類化為一個公共部分:

template<typename T>
struct my_traits :
    public my_specializing_traits<T>
{   
    static constexpr T min() { return std::numeric_limits<T>::min(); }
    static constexpr T max() { return std::numeric_limits<T>::max(); }
};  

以下顯示使用它(輸出0和1)

int main()
{   
    std::cout << my_traits<char>().some_trait << std::endl;
    std::cout << my_traits<int>().some_trait << std::endl;
}   

暫無
暫無

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

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