can C++;模板是否检测特定类型的成员? < C++模板是否可以检测特定类型的成员?代码如下: template <typename T> class Element { }; template <typename T> class Container { public: Container() { // check if T has member which type is "Element<whatever>" // how many Element<whatever>s? // offset? } }; 模板 类元素{ }; 模板 类容器{ 公众: 容器(){ //检查T是否有类型为“元素”的成员 //有多少元素? //抵消? } };

can C++;模板是否检测特定类型的成员? < C++模板是否可以检测特定类型的成员?代码如下: template <typename T> class Element { }; template <typename T> class Container { public: Container() { // check if T has member which type is "Element<whatever>" // how many Element<whatever>s? // offset? } }; 模板 类元素{ }; 模板 类容器{ 公众: 容器(){ //检查T是否有类型为“元素”的成员 //有多少元素? //抵消? } };,c++,C++,我有一个名为Container的模板类,我想检查: 如果传入的类型T具有成员,则类型是元素 如果是的话,我可以得到多少个成员,哪种类型是元素 如果是这样的话,我可以得到到课程开始的偏移量吗 详细解释要求3: 我想要的是,当我获得一段由reinterpret\u cast转换的数据时,访问这些字段(如果存在),如果容器的T是一个聚合,这在C++20中是可行的;我使用boost::pfr库,因为它简化了这个习惯用法,但很容易手动重新实现(boost::pfr的源代码非常容易阅读) #包括 模板 自动

我有一个名为
Container
的模板类,我想检查:

  • 如果传入的类型
    T
    具有成员,则类型是
    元素
  • 如果是的话,我可以得到多少个成员,哪种类型是
    元素
  • 如果是这样的话,我可以得到到课程开始的偏移量吗
  • 详细解释要求3:


    我想要的是,当我获得一段由
    reinterpret\u cast

    转换的数据时,访问这些字段(如果存在),如果
    容器的
    T
    是一个聚合,这在C++20中是可行的;我使用boost::pfr库,因为它简化了这个习惯用法,但很容易手动重新实现(boost::pfr的源代码非常容易阅读)

    #包括
    模板
    自动计数\u类型()的\u成员\u
    {
    无符号整数计数=0;
    boost::pfr::for_每个_字段(T{},[&](U&){
    计数+=标准::是否相同;
    });
    返回计数;
    }
    
    给定

    structfoo{
    要素a、b;
    元素c;
    std::字符串d;
    };
    
    然后

    count\u type()的\u成员数=2
    

    在gcc.godbolt.org上运行示例:

    No,这是不可能的。你所要求的是编译时反射,它还没有在C++中。对于2个模板,TFO和TeleMsFoO对于更基本的类来说可能更干净。你可以检查一个成员的存在,因为你知道它的名字。你所要求的是不可能的。
    struct Foo {
      Element<int> a, b;
      Element<float> c;
      std::string d;
    };
    
    count_members_of_type<Foo, Element<int>>() == 2