gpt4 book ai didi

c++ - 模板元编程。类(class)成员的有条件存在

转载 作者:太空宇宙 更新时间:2023-11-04 15:58:41 24 4
gpt4 key购买 nike

我想知道是否可以编写一个模板类,在其编译版本中设置不同的成员。

例如,如何使用继承来实现:

/// These statistics are supported for all data types
struct StatsBase {
size_t count;

virtual void Describe() { print(count); }
};

/// These can describe almost all data types, but not all of them
template<DataType data_type>
struct StatsMinMax : public StatsBase {
CppType<data_type> min;
CppType<data_type> max;

void Describe() override {
StatsBase::Describe();
print(min);
print(max);
}
};

/// These are for numeric data types only
template<DataType data_type>
struct StatsAll : public StatsMinMax<data_type> {
CppType<data_type> sum;

void Describe() override {
StatsMinMax<data_type>::Describe();
print(sum);
}
}

并且,假设我有以下 constexpr 函数

constexpr bool IsMinMaxSupported(data_type dt) { /* details */ }
constexpr bool IsSumSupported(data_type dt) { /* details */ }

所以,问题是是否可以用 C++ 表达这样的东西:

template<DataType data_type>
struct Stats {
size_t count;
CppType<data_type> min; // Must exist only in those instances, where IsMinMaxSupported(data_type) == true
CppType<data_type> max; // Must exist only in those instances, where IsMinMaxSupported(data_type) == true
CppType<data_type> sum; // Must exist only in those instances, where IsSumSupported(data_type) == true

void Describe() {
print(count);
if (IsMinMaxSupported(data_type)) {
print(min);
print(max);
}
if (IsSumSupported(data_type)) {
print(sum);
}
}
};

这意味着某些字段在某些情况下不能物理存在(这对内存消耗至关重要)。如果可能的话,方法 Describe() 会像我写的那样被编译,还是应该使用 SFINAE 重写(通过适当的特化)?

最佳答案

可以通过模板特化来实现:

template<typename DataType, bool x_min_max_supported> struct
StatsMinMax { /* empty */ };

template<typename DataType> struct
StatsMinMax<DataType , true>
{
DataType min;
DataType max;
};

...

template<DataType data_type>
struct Stats
: public StatsMinMax<DataType, IsMinMaxSupported(data_type)>
{

关于c++ - 模板元编程。类(class)成员的有条件存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49999349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com