2016-03-13 20 views
8

Tôi có một lớp học để mô tả một số đặc điểm của một loại.Chuyên constexpr tĩnh thành viên dữ liệu

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

Tôi muốn chuyên my_traits::some_trait nhưng khi tôi cố gắng:

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

Trình biên dịch phàn nàn rằng my_traits::some_trait đã có một khởi tạo. Tất nhiên tôi có thể chuyên nó bằng cách thực hiện:

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

    // min and max 
}; 

nhưng sau đó tôi phải xác định lại tất cả các chức năng khác, mặc dù chúng sẽ giống hệt nhau.

Vậy làm thế nào tôi có thể chuyên my_traits<int>::some_trait mà không phải lặp lại minmax?

+0

AFAIK điều này là không thể. Biến 'constexpr' phải được khởi tạo hoặc được xây dựng trong khai báo của nó. –

+6

'tĩnh constexpr int some_trait = my_helper :: trị; ' –

+1

Bạn có thể tìm kiếm để khởi tạo nó từ một' chức năng constexpr', hoặc lớp tiện ích, đó là chuyên ngành cho các loại 'int' – Niall

Trả lời

5

Có một số cách để làm điều đó. @Piotr Skotnicki và @Niall đề cập khởi tạo thông qua một số trợ giúp có thể được chuyên môn hóa. Nói chung, chỉ cần tái cấu trúc mã của bạn để bạn có thể chuyên một số lớp hoặc các chức năng, và sau đó sử dụng (bởi thành phần hoặc thừa kế) những phần chuyên bởi phần mà bạn không cần phải chuyên môn hóa.

Như một ví dụ về một thay thế cho các ý kiến, đây là một cơ sở chuyên:

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

Bây giờ bạn chỉ có thể phân lớp nó thành một phần chung:

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

Sau đây cho thấy nó được sử dụng (nó xuất ra 0 và 1)

int main() 
{ 
    std::cout << my_traits<char>().some_trait << std::endl; 
    std::cout << my_traits<int>().some_trait << std::endl; 
} 
Các vấn đề liên quan