是否可以获得未知类的类成员的数量和类型?

时间:2019-07-01 14:44:26

标签: c++ templates macros c++17

我有一个类似的黑匣子类:

class foo
{/* body is unavailable for me to inspect */};

foo可以是模板。

此类是终极黑匣子;
-我对它的成员一无所知
-我对它的方法一无所知
-等等

我正在尝试实现class_traits类:

template <typename T>
class class_traits
{
// impl
}

这将允许我执行以下操作(或至少执行类似操作的结果)

int main()
{
    cout << class_traits<foo>::member_count << endl;
    cout << typeid(class_traits<foo>::member<0>::type).name() << endl;
    cout << typeid(class_traits<foo>::member<1>::type).name() << endl;
    cout << typeid(class_traits<foo>::member<2>::type).name() << endl;
    return 0;
};

有可能这样做吗?如果是这样,怎么办?
我仅限于c++17
我完全可以使用宏和其他“ hacky”解决方案(如果可能的话,我希望将其保留在编译时而不是运行时)。

2 个答案:

答案 0 :(得分:5)

“是否可以获取未知类的类成员的数量和类型?” -不。

您正在寻找的是称为 reflection 的功能,C ++(17和更早版本)没有 (未来版本可能是 )具有它的某种形式。)

答案 1 :(得分:3)

如果您的类是可以分解的东西,则可以滥用结构化绑定以获得原始的反射形式。有关示例,请参见magic_get

来自README

struct some_person {
    std::string name;
    unsigned birth_year;
};

int main() {
    some_person val{"Edgar Allan Poe", 1809};

    std::cout << boost::pfr::get<0>(val)                // No macro!
        << " was born in " << boost::pfr::get<1>(val);  // Works with any aggregate initializables!
}