[英]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
};
但是我必須重新定義所有其他功能,即使它們完全相同。
那么如何在不重復min
和max
情況下專門化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.