【问题标题】:Make derived class follow trait使派生类遵循特征
【发布时间】:2018-05-15 16:04:32
【问题描述】:

假设我有一个基类

class Base {};

std::is_trivial<Base>::valuetrue。有没有办法强制从Base 派生的所有类也变得微不足道?

也就是说,我该如何修改Base,从而导致编译错误?

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

【问题讨论】:

  • 你是专门问private继承的使用吗?
  • IMO 这是不可能的。另一方面,如果您降低要求,则有可能。也许检查从Base 派生并用于特定函数的类型是微不足道的。为什么你需要这种特质是真实的?
  • 我认为 YSC 是正确的。我在想你可以使用 CRTP,但你无法检查派生类是否微不足道,因为它在基类中不完整。
  • @NathanOliver 而且你不能强制子类的作者作弊或滥用 CRTP。
  • 鉴于平凡的类不能是多态的,你为什么要关心?

标签: c++ typetraits


【解决方案1】:

根本不写构造函数:

#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>{});

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多