特化静态 constexpr 数据成员

Specialize static constexpr data member

我有一个class来描述一个类型的一些特征。

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

有几种方法可以做到这一点。 @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;
}