【问题标题】:Get tuple of inherited base classes' types获取继承的基类类型的元组
【发布时间】:2019-09-01 15:43:21
【问题描述】:

我正在寻找一种方法来获取所有继承类的元组包,但找不到。

意图:如果一个类继承自模板基类,我需要静态断言。模板参数将从基础模板的特化中推断出来,因为我可以首先推断出它的类型名。 私有继承。

这能做到吗?

class Inherited : ClassA, ClassB ..., Class N
{};

//Expected usage
templ_traits<Inherited>::bases_tuple;
templ_traits<Inherited>::bases_count;

【问题讨论】:

  • "这能做到吗?" 你只能得到一个包含所有类数据成员类型的元组。你所说的最终是反射,这不是 C++ 在这一点上真正拥有的东西。
  • 虽然有合理的反射需求,但也许有适合您的用例的解决方法?考虑详细说明你提出这个问题的原因。也许还有另一种方法可以满足您的需求?
  • 如果您可以在层次结构的每个类上添加一些类型别名,就可以做到这一点。这是一个选择吗?
  • @StoryTeller 我的特殊情况正在工作,但我希望改进使用。我不想提供与基本抽象类一起工作,尽管它可以工作。稍后,当我通过正确的 Internet 连接访问我的 PC 时,我将按照我最初的意图更新帖子。不过,我认为这个问题本身就很有趣。
  • @rubenvb 你到底是什么意思?

标签: c++ c++17 variadic-templates typedef


【解决方案1】:

您无法使用当前语言获得该列表,但您可以使用std::is_base 来解决您的实际问题。

来自https://en.cppreference.com/w/cpp/types/is_base_of

#include <iostream>
#include <type_traits>

class A {};

class B : A {};

class C {};

int main() 
{
    std::cout << std::boolalpha;
    std::cout << "a2b: " << std::is_base_of<A, B>::value << '\n';
    std::cout << "b2a: " << std::is_base_of<B, A>::value << '\n';
    std::cout << "c2b: " << std::is_base_of<C, B>::value << '\n';
    std::cout << "same type: " << std::is_base_of<C, C>::value << '\n';
}

输出:

a2b: true
b2a: false
c2b: false
same type: true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    相关资源
    最近更新 更多