专用于静态 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
};
但是我必须重新定义所有其他函数,即使它们完全相同。
那么,我怎样才能专攻my_traits<int>::some_trait
而不必重复min
和max
呢?
有几种方法可以做到这一点。 @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;
}
相关文章:
- 用于访问容器<T>数据成员的正确 API
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 多成员Constexpr结构初始化
- 数据成员SFINAE的C++17测试:gcc vs clang
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 静态数据成员:它"const declaration / constexpr definition"起作用?
- 不带初始值设定项的 constexpr 静态数据成员
- 现在允许重新定义 constexpr 静态数据成员吗?(但不是内联常量)?
- 定义 constexpr 静态数据成员
- constexpr 成员函数,C++中的 std::向量数据成员
- 指向数据成员转换的 Constexpr 指针
- 静态(可能是constexpr)数据成员lambda
- 使用折叠表达式初始化静态 constexpr 类数据成员不编译
- 重新声明静态 constexpr 数据成员?
- 警告:ISO C++禁止将静态“constexpr char*”数据成员的字符串常量转换为“char*”
- 我可以只为特定的专业化定义静态constexpr数据成员吗
- 专用于静态 constexpr 数据成员
- 为什么在类中初始化的非整型静态数据成员必须是 constexpr
- 在c++ 14中,constexpr成员可以更改数据成员
- ' static constexpr auto '数据成员初始化为未命名的枚举