使派生类遵循特征

Make derived class follow trait

本文关键字:特征 派生      更新时间:2023-10-16

假设我有一个基类

class Base {};

std::is_trivial<Base>::valuetrue.有没有办法强制所有派生自Base的类也是微不足道的?

换句话说,如何修改Base以导致编译错误?

class Derived : public Base {
Derived() {}
};

干脆不要写构造函数:

#include <iostream>
#include <type_traits>
#include <cassert> 
struct A {
int m;
};
struct B : A{
B() {}
};
struct C : A{
C() = default;
};
int main() 
{
assert( std::is_trivial<A>{});
assert(!std::is_trivial<B>{});
assert( std::is_trivial<C>{});
}

要做"强制执行"部分更棘手,你可以放一个约束,但使用 CRTP。

#include <iostream>
#include <type_traits>
#include <cassert> 
template<class D>
struct A {
int m;
static void enforce(){static_assert(std::is_trivial<D>{},"");}
};
/*struct B : A<B>{
B() {}
};*/
struct C : A<C>{
C() = default;
};
int main() 
{
//    assert( std::is_trivial<A>{});
//    assert(!std::is_trivial<B>{});
assert( std::is_trivial<C>{});
}