专门化静态constexpr数据成员

时间:2016-03-13 17:57:40

标签: c++ c++14 template-specialization

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

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_traitmin的情况下专注max

1 个答案:

答案 0 :(得分:6)

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