繁体   English   中英

专门化静态constexpr数据成员

[英]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
};

但是我必须重新定义所有其他功能,即使它们完全相同。

那么如何在不重复minmax情况下专门化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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM