专用于静态 constexpr 数据成员

Specialize static constexpr data member

本文关键字:数据成员 constexpr 静态 用于 专用      更新时间:2023-10-16

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

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