我有一个类似的黑匣子类:
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”解决方案(如果可能的话,我希望将其保留在编译时而不是运行时)。
答案 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!
}