特化静态 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
而不必重复 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;
}
我有一个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
而不必重复 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;
}