2016-03-13 168 views
8

我有一個類來描述某種類型的某些特徵。專業靜態constexpr數據成員

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 
}; 

但我必須重新定義所有其他的功能,即使他們將是完全一樣的。

那麼我怎樣才能專注於my_traits<int>::some_trait而不必重複minmax

+0

AFAIK這是不可能的。一個'constexpr'變量必須在其聲明中初始化或構造。 –

+6

'static constexpr int some_trait = my_helper :: value;' –

+1

您可以從'constexpr'函數或實用程序類初始化它,它是專門用於'int'類型的' – Niall

回答

5

有幾種方法可以做到這一點。 @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; 
}